zoukankan      html  css  js  c++  java
  • 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

    输出结果:

     
     
  • 相关阅读:
    with check option(视图 )
    @@ERROR
    事务处理
    含有自增序列的表中使用truncate与delete的不同结果
    Oracle中的通配符
    Java方法重载
    java递归方法
    Oracle中的for语句
    Uboot 2014.07 makefile分析
    linux内核目录结构
  • 原文地址:https://www.cnblogs.com/Ray-0808/p/10616694.html
Copyright © 2011-2022 走看看