一些主要的分类算法介绍。
sklearn转换器和估计器 转换器 我们把特征工程的接口称之为转换器,其中转换器调用有这么几种形式
fit_transform
fit —— 计算
transform —— 进行最终的转换
估计器 在sklearn中,估计器(estimator)是一个重要的角色,是一类实现了算法的API
1、用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
sklearn.tree 决策树与随机森林
2、用于回归的估计器:
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
3、用于无监督学习的估计器
sklearn.cluster.KMeans 聚类
步骤 1、实例化一个estimator(转换器)
2、estimator.fit (x_train, y_train) 计算
——调用完毕,生成模型
3、模型评估:
(1)直接对比真实值和预估值
y_predict = estimator.predict(x_test)
y_test == y_predict
(2)计算准确率
accuracy = extimator.score(x_test, y_test)
K-近邻算法 定义 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别 ,则该样本也属于这个类别。
来源:KNN算法最早是由Cover和Hart提出的一种分类算法
距离公式 两个样本的距离可以通过如下公式计算,又叫欧式距离。
还有其他的距离公式,如:曼哈顿距离,明可夫斯基距离等。
K-近邻算法API sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=’auto’)
n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
案例:基于鸢尾花数据集的KNN算法实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 """ fit:原义指的是安装、使适合的意思,其实有点train的含义但是和train不同的是, 它并不是一个训练的过程,而是一个适配的过程,过程都是定死的,最后只是得到了一个统一的转换的规则模型。 transform:是将数据进行转换,比如数据的归一化和标准化,将测试数据按照训练数据同样的模型进行转换,得到特征向量。 fit_transform:可以看做是fit和transform的结合, 如果训练阶段使用fit_transform,则在测试阶段只需要对测试样本进行transform就行了。 """ def knn_iris () : """ 用 knn 算法对鸢尾花进行分类 """ iris = load_iris() x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6 ) transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) estimator = KNeighborsClassifier(n_neighbors=3 ) estimator.fit(x_train, y_train) y_predict = estimator.predict(x_test) print("y_predict:" , y_predict) print("直接对比真实值和预估值:" , y_test == y_predict) score = estimator.score(x_test, y_test) print("准确率为: " , score) return None
交叉验证和网格搜索 什么是交叉验证(cross validation) 交叉验证,就是将拿到的训练数据,分为训练和验证集。
即 为了让从训练得到模型结果更加准确。 做以下处理
以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。
交叉验证目的:为了让被评估的模型更加准确可信
什么是网格搜索(Grid Search) 通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数 。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
超参数是在机器开始学习之前设置,不是通过训练得到的。
交叉验证,网格搜索(模型选择与调优)API sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进行详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
cv:指定几折交叉验证
fit:输入训练数据
score:准确率
结果分析:
bestscore__:在交叉验证中验证的最好结果
bestestimator:最好的参数模型
cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
参考链接:https://blog.csdn.net/hohaizx/article/details/81013985
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.preprocessing import StandardScalerfrom sklearn.neighbors import KNeighborsClassifier""" fit:原义指的是安装、使适合的意思,其实有点train的含义但是和train不同的是, 它并不是一个训练的过程,而是一个适配的过程,过程都是定死的,最后只是得到了一个统一的转换的规则模型。 transform:是将数据进行转换,比如数据的归一化和标准化,将测试数据按照训练数据同样的模型进行转换,得到特征向量。 fit_transform:可以看做是fit和transform的结合, 如果训练阶段使用fit_transform,则在测试阶段只需要对测试样本进行transform就行了。 """ def knn_iris () : iris = load_iris() x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22 ) transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) estimator = KNeighborsClassifier() param_dict = {"n_neighbors" : [1 , 3 , 5 ]} estimator = GridSearchCV(estimator, param_grid=param_dict, cv=5 ) estimator.fit(x_train, y_train) y_predict = estimator.predict(x_test) print("比对预测结果和真实值:\n" , y_predict == y_test) score = estimator.score(x_test, y_test) print("直接计算准确率:\n" , score) print("在交叉验证中验证的最好结果:\n" , estimator.best_score_) print("最好的参数模型:\n" , estimator.best_estimator_) print("每次交叉验证后的准确率结果:\n" , estimator.cv_results_) if __name__ == "__main__" : knn_iris()
朴素贝叶斯算法 先初步给出代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 from sklearn.naive_bayes import MultinomialNBfrom sklearn.datasets import fetch_20newsgroupsfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import TfidfVectorizerdef nb_news () : """ 用 朴素贝叶斯 方法对新闻进行分类 :return: """ news = fetch_20newsgroups(subset='all' ) x_train, x_test, y_train, y_test = train_test_split(news.data, news.target) transfer = TfidfVectorizer() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) estimator = MultinomialNB() estimator.fit(x_train, y_train) y_predict = estimator.predict(x_test) print(y_predict) print(y_predict == y_test) score = estimator.score(x_test, y_test) print(score) return None if __name__ == "__main__" : nb_news()