分类算法
sklearn转换器和预估器
转换器——特征工程的父类
步骤:
1、实例化(实例化一个转换器类(Transformer))
2、调用fit_transform
对于文档建立分类词频矩阵,不能同时调用
标准化公式:
(x-mean)/ std
fit_transform()
fit() ——计算每一列的平均值和标准差
transform() —— (x-mean)/ std
进行最终的转换
估计器
在sklearn中,估计器是一个重要的角色
用于分类的估计器:
sklearn.neighbors
sklearn.naive_bayes
sklearn.linear_model.LogisticRegression
sklearn.tree
用于回归的估计器
sklearn.linear_model.LinearRegresssion
sklearn.linear_model.Ridge
用于无监督学习的估计器
sklearn.cluster.KMeans
估计器步骤:
1、实例化一个estimator
2、estimator.fit(x_train,y_train)——调用完毕,模型生成 3、模型评估
(1)直接比对真实值和预测值
y_predict=estimaor.predict(x_test) y_test==y_predict
(2)计算准确率
accuracy=estimator.score(x_test,y_test)
KNN算法
什么是KNN算法?
核心思想:根据你的邻居推断出你的类别。如果一个样本在特征空间中K个最相似的(特征空间中最邻近)的样本中大多数属于其中一个类别,则该样本也属于这个类别。
如何确定谁最邻近?
距离公式:
欧氏距离——平方根距离
曼哈顿距离——绝对值距离
明可夫斯基距离
具体案例:
有几部电影:
方法:
利用K近邻算法的思想
(1)计算与已知电影之间的距离:
k=1:爱情片
k=2:爱情片
k=6:无法确定
1、如果取得最近的电影数量不一样,出现的结果?
k值取得过大,容易出错(样本不均衡)
k值取得过小,容易受到异常点的影响
2、结合已经学习过的知识,分析KNN算法需要做什么样的处理?
无量纲化的处理(标准化)
使用方法:
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors=5
int可选,默认是5,k_neighbors查询默认使用的邻居数。
algorithm:['auto','ball_tree','kd_tree','brute']
可选用于计算最近邻居的算法:ball_tree’将会使用BallTree,kd_tree’将使用KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)
def knn_iris():
#1)获取数据
iris load_iris()
#2)划分数据集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
#3)特征工程:标难化
transfer StandardScaler()
x_train transfer.fit_transform(x_train)
x_test transfer.transform(x_test)#训练集和测试机需要做相同的处理
#4)KNN算法预估器
estimator=KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)
#5)模型评估
#方法1:直接比对真实值和预测值
y_predict estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test=y_predict)
#方法2:计算准确率
score=estimator.score(x_test,y_test)
print("准确率为:\n",score)
运行结果:
KNN算法优缺点
优点:
简单、易于理解,易于实现、无需训练
缺点:
懒惰算法,对测试样本分类时的计算量大,内容开销大
必须使用指定K值,K值选择不当则分类精度不能保证。
使用场景:
小数据场景,几千-几万样本,具体场景具体业务去测试。
模型的选择与调优
模型选择与调优:
交叉验证
将拿到的训练数据分为训练集和验证集,以下图为例,将数据分为4组,其中一份作为验证集,然后经过4次测试,每次更换不同的验证集,得到4组不同的验证集,得到四组模型的结果,取平均值作为最终结果。
目的:
为了让被评估的模型更加准确可信
超参数搜索:
通常情况下,有很多参数是需要手动指定的,这种叫做超参数,每组超参数都采用交叉验证来进行评估,最后选出最优参数组合建立模型。
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
输出结果:
最佳参数:best_params
最住结果:best_score
最佳估计器:best_estimator
交叉验证结果:cv_results.
案例分析:鸢尾花案例增加K值调优
from sklearn.model_selection import GridSearchCV
def knn_iris():
#1)获取数据
iris load_iris()
#2)划分数据集
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
#3)特征工程:标难化
transfer StandardScaler()
x_train transfer.fit_transform(x_train)
x_test transfer.transform(x_test)#训练集和测试机需要做相同的处理
#4)KNN算法预估器
estimator=KNeighborsClassifier(n_neighbors=3)
#加入网格搜索与交叉验证
params_dict={
"n_neighbors":[1,3,5,7,9,11]}
estimator=GridSearchCV(estimator,params_grid=params_grid,cv=10)
estimator.fit(x_train,y_train)
#5)模型评估
#方法1:直接比对真实值和预测值
y_predict estimator.predict(x_test)
print("y_predict:\n",y_predict)