scikit-learn中机器学习模型比较(逻辑回归与KNN)
本文源自于Kevin Markham 的模型评估:https://github.com/justmarkham/scikit-learn-videos/blob/master/05_model_evaluation.ipynb
应办事项:
- 我的监督学习应该使用哪一个模型
- 我的模型中应该选择那些调整参数
- 如何估计模型在样本数据外的表现
评论:
- 分类任务:预测未知鸢尾花的种类
- 用三个分类模型:KNN(K=1),KNN(K=5),逻辑回归
- 需要一个选择模型的方法:模型评估
1. 训练测试整个数据集
在整个数集上进行训练,然后用同一个数集进行测试,评估准确度。
1 1 from sklearn.datasets import load_iris 2 2 from sklearn.linear_model import LogisticRegression 3 3 4 4 # 1.read in the iris data 5 5 iris=load_iris() 6 6 X=iris.data 7 7 Y=iris.target 8 8 # print(X) 9 9 # print(Y) 10 10 11 11 # 2.logistic regression 12 12 logreg=LogisticRegression() 13 13 logreg.fit(X,Y) 14 14 y_pred=logreg.predict(X) 15 15 print(len(y_pred))
输出结果:
会发现有两个warning,但不影响结果,强迫症表示消灭红字。
分析和查阅logisticregression
将 logreg=LogisticRegression() 改为 logreg=LogisticRegression(solver='liblinear',multi_class='ovr') 即可。
三者初步比较:
1 from sklearn.datasets import load_iris 2 from sklearn.linear_model import LogisticRegression 3 from sklearn import metrics 4 from sklearn.neighbors import KNeighborsClassifier 5 6 # 1.read in the iris data 7 iris=load_iris() 8 X=iris.data 9 Y=iris.target 10 # print(X) 11 # print(Y) 12 13 # 2.logistic regression 14 logreg=LogisticRegression(solver='liblinear',multi_class='ovr') 15 logreg.fit(X,Y) 16 y_logreg_pred=logreg.predict(X) 17 print(len(y_logreg_pred)) 18 print(metrics.accuracy_score(Y,y_logreg_pred)) 19 20 # 3.KNN=5 21 knn=KNeighborsClassifier(n_neighbors=5) 22 knn.fit(X,Y) 23 y_knn5_pred=knn.predict(X) 24 print(len(y_knn5_pred)) 25 print(metrics.accuracy_score(Y,y_knn5_pred)) 26 27 # 4.KNN=1 28 knn=KNeighborsClassifier(n_neighbors=1) 29 knn.fit(X,Y) 30 y_knn1_pred=knn.predict(X) 31 print(len(y_knn1_pred)) 32 print(metrics.accuracy_score(Y,y_knn1_pred))
输出结果:
问题:
- 目标是评测模型样本以外的数据表现
- 但是,最大化培训精度奖励过于复杂的模型,模型不能泛化
- 不必要的复杂模型过度拟合
2. 分开训练和测试集
将数据集一分为二,一部分用于训练,另一部分用于测试。
1 from sklearn.datasets import load_iris 2 from sklearn.linear_model import LogisticRegression 3 from sklearn import metrics 4 from sklearn.neighbors import KNeighborsClassifier 5 from sklearn.model_selection import train_test_split 6 7 # 1.read in the iris data 8 iris=load_iris() 9 X=iris.data 10 Y=iris.target 11 12 # 2.split X,Y 13 x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.4,random_state=4) 14 print(x_train.shape) 15 print(x_test.shape) 16 print(y_train.shape) 17 print(y_test.shape) 18 19 # 3.logistic regression 20 logreg=LogisticRegression(solver='liblinear',multi_class='ovr') 21 logreg.fit(x_train,y_train) 22 y_logreg_pred=logreg.predict(x_test) 23 print(metrics.accuracy_score(y_test,y_logreg_pred)) 24 25 # 3.KNN=5 26 knn=KNeighborsClassifier(n_neighbors=5) 27 knn.fit(x_train,y_train) 28 y_knn5_pred=knn.predict(x_test) 29 print(metrics.accuracy_score(y_test,y_knn5_pred)) 30 31 # 4.KNN=1 32 knn=KNeighborsClassifier(n_neighbors=1) 33 knn.fit(x_train,y_train) 34 y_knn1_pred=knn.predict(x_test) 35 print(metrics.accuracy_score(y_test,y_knn1_pred))
输出结果:
观察不同的KNN中的k值对准确度会有什么影响。
1 import matplotlib.pyplot as plt 2 # print(k_range) 3 scores=[] 4 for k in k_range: 5 knn=KNeighborsClassifier(n_neighbors=k) 6 knn.fit(x_train,y_train) 7 y_knnk_pred=knn.predict(x_test) 8 scores.append(metrics.accuracy_score(y_test,y_knnk_pred)) 9 plt.plot(k_range,scores) 10 plt.xlabel('value of k for KNN') 11 plt.ylabel('testing accurancy') 12 plt.show()
输出结果:
从上可以观察出k的取值对准确度的影响,k太小或太大都不是最佳值。
3. 预测
取k=11(7~16)。
1 # 6.predict 2 knn=KNeighborsClassifier(n_neighbors=11) 3 knn.fit(x_train,y_train) 4 y_pred=knn.predict([[3,5,4,2]]) 5 print(y_pred)
输出结果:
4. 附注:
KNN算法:https://www.jianshu.com/p/48d391dab189
KNN与K-Means区别:https://www.cnblogs.com/nucdy/p/6349172.html