scikit-learn中机器学习模型比较(逻辑回归与KNN)

本文源自于Kevin Markham 的模型评估:https://github.com/justmarkham/scikit-learn-videos/blob/master/05_model_evaluation.ipynb

应办事项:
  1. 我的监督学习应该使用哪一个模型
  2. 我的模型中应该选择那些调整参数
  3. 如何估计模型在样本数据外的表现
评论:
  1. 分类任务:预测未知鸢尾花的种类
  2. 用三个分类模型:KNN(K=1),KNN(K=5),逻辑回归
  3. 需要一个选择模型的方法:模型评估

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))
View Code
输出结果:
 
会发现有两个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))
View Code
输出结果:
问题:
  1. 目标是评测模型样本以外的数据表现
  2. 但是,最大化培训精度奖励过于复杂的模型,模型不能泛化
  3. 不必要的复杂模型过度拟合

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))
View Code
输出结果:
 
观察不同的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()
View Code

输出结果:

从上可以观察出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)
View Code

输出结果:

 
 
posted @ 2019-03-28 18:44  滇红88号  阅读(986)  评论(0编辑  收藏  举报