• 售前

  • 售后

热门帖子
入门百科

Python之Sklearn利用入门教程

[复制链接]
老跃1 显示全部楼层 发表于 2021-10-25 19:08:48 |阅读模式 打印 上一主题 下一主题
1.Sklearn简介

Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。当我们面临机器学习题目时,便可根据下图来选择相应的方法。Sklearn具有以下特点:
      
  • 简单高效的数据发掘和数据分析工具  
  • 让每个人能够在复杂情况中重复使用  
  • 创建NumPy、Scipy、MatPlotLib之上

2.Sklearn安装

Sklearn安装要求
  1. Python(>=2.7 or >=3.3)
复制代码
  1. NumPy (>= 1.8.2)
复制代码
  1. SciPy (>= 0.13.3)
复制代码
。假如已经安装NumPy和SciPy,安装scikit-learn可以使用
  1. pip install -U scikit-learn
复制代码

3.Sklearn通用学习模式

Sklearn中包含浩繁机器学习方法,但各种学习方法大抵相同,我们在这里介绍Sklearn通用学习模式。起首引入必要练习的数据,Sklearn自带部分数据集,也可以通过相应方法进行构造,
  1. 4.Sklearn datasets
复制代码
中我们会介绍如何构造数据。然后选择相应机器学习方法进行练习,练习过程中可以通过一些本领调解参数,使得学习正确率更高。模子练习完成之后便可猜测新数据,然后我们还可以通过
  1. MatPlotLib
复制代码
等方法来直观的展示数据。别的还可以将我们已练习好的Model进行保存,方便移动到其他平台,不必重新练习。
  1. from sklearn import datasets#引入数据集,sklearn包含众多数据集
  2. from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
  3. from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据
  4. ###引入数据###
  5. iris=datasets.load_iris()#引入iris鸢尾花数据,iris数据包含4个特征变量
  6. iris_X=iris.data#特征变量
  7. iris_y=iris.target#目标值
  8. X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3)#利用train_test_split进行将训练集和测试集进行分开,test_size占30%
  9. print(y_train)#我们看到训练数据的特征值分为3类
  10. '''
  11. [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  12. 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  13. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
  14. 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
  15. 2 2]
  16. '''
  17. ###训练数据###
  18. knn=KNeighborsClassifier()#引入训练方法
  19. knn.fit(X_train,y_train)#进行填充测试数据进行训练
  20. ###预测数据###
  21. print(knn.predict(X_test))#预测特征值
  22. '''
  23. [1 1 1 0 2 2 1 1 1 0 0 0 2 2 0 1 2 2 0 1 0 0 0 0 0 0 2 1 0 0 0 1 0 2 0 2 0
  24. 1 2 1 0 0 1 0 2]
  25. '''
  26. print(y_test)#真实特征值
  27. '''
  28. [1 1 1 0 1 2 1 1 1 0 0 0 2 2 0 1 2 2 0 1 0 0 0 0 0 0 2 1 0 0 0 1 0 2 0 2 0
  29. 1 2 1 0 0 1 0 2]
  30. '''
复制代码
4.Sklearn datasets

Sklearn提供一些标准数据,我们不必再从其他网站探求数据进行练习。例如我们上面用来练习的
  1. load_iris
复制代码
数据,可以很方便的返回数据特征变量和目标值。除了引入数据之外,我们还可以通过
  1. load_sample_images()
复制代码
来引入图片。

除了sklearn提供的一些数据之外,还可以自己来构造一些数据帮助我们学习。
  1. from sklearn import datasets#引入数据集
  2. #构造的各种参数可以根据自己需要调整
  3. X,y=datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=1)
  4. ###绘制构造的数据###
  5. import matplotlib.pyplot as plt
  6. plt.figure()
  7. plt.scatter(X,y)
  8. plt.show()
复制代码

5.Sklearn Model的属性和功能

数据练习完成之后得到模子,我们可以根据差别模子得到相应的属性和功能,并将其输出得到直观效果。假如通过线性回归练习之后得到线性函数
  1. y=0.3x+1
复制代码
,我们可通过
  1. _coef
复制代码
得到模子的系数为0.3,通过
  1. _intercept
复制代码
得到模子的截距为1。
  1. from sklearn import datasets
  2. from sklearn.linear_model import LinearRegression#引入线性回归模型
  3. ###引入数据###
  4. load_data=datasets.load_boston()
  5. data_X=load_data.data
  6. data_y=load_data.target
  7. print(data_X.shape)
  8. #(506, 13)data_X共13个特征变量
  9. ###训练数据###
  10. model=LinearRegression()
  11. model.fit(data_X,data_y)
  12. model.predict(data_X[:4,:])#预测前4个数据
  13. ###属性和功能###
  14. print(model.coef_)
  15. '''
  16. [ -1.07170557e-01  4.63952195e-02  2.08602395e-02  2.68856140e+00
  17. -1.77957587e+01  3.80475246e+00  7.51061703e-04 -1.47575880e+00
  18.   3.05655038e-01 -1.23293463e-02 -9.53463555e-01  9.39251272e-03
  19. -5.25466633e-01]
  20. '''
  21. print(model.intercept_)
  22. #36.4911032804
  23. print(model.get_params())#得到模型的参数
  24. #{'copy_X': True, 'normalize': False, 'n_jobs': 1, 'fit_intercept': True}
  25. print(model.score(data_X,data_y))#对训练情况进行打分
  26. #0.740607742865
复制代码
6.Sklearn数据预处理

数据集的标准化对于大部分机器学习算法来说都是一种常规要求,假如单个特征没有或多或少地靠近于标准正态分布,那么它大概并不能在项目中体现出很好的性能。在现实情况中,我们经常忽略特征的分布外形,直接去均值来对某个特征进行中央化,再通过除以非常量特征(non-constant features)的标准差进行缩放。
例如, 许多学习算法中目标函数的基础都是假设全部的特征都是零均值而且具有同一阶数上的方差(比如径向基函数、支持向量机以及L1L2正则化项等)。假如某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们说盼望的那样,从其他特征中学习。例如我们可以通过Scale将数据缩放,达到标准化的目标。
  1. from sklearn import preprocessing
  2. import numpy as np
  3. a=np.array([[10,2.7,3.6],
  4.       [-100,5,-2],
  5.       [120,20,40]],dtype=np.float64)
  6. print(a)
  7. print(preprocessing.scale(a))#将值的相差度减小
  8. '''
  9. [[ 10.   2.7  3.6]
  10. [-100.   5.  -2. ]
  11. [ 120.  20.  40
  12. [[ 0.     -0.85170713 -0.55138018]
  13. [-1.22474487 -0.55187146 -0.852133 ]
  14. [ 1.22474487 1.40357859 1.40351318]]
  15. '''
复制代码
我们来看下预处理前和预处理预处理后的差别,预处理之前模子评分为
  1. 0.511111111111
复制代码
,预处理后模子评分为
  1. 0.933333333333
复制代码
,可以看到预处理对模子评分有很大程度的提升。
  1. from sklearn.model_selection import train_test_split
  2. from sklearn.datasets.samples_generator import make_classification
  3. from sklearn.svm import SVC
  4. import matplotlib.pyplot as plt
  5. ###生成的数据如下图所示###
  6. plt.figure
  7. X,y=make_classification(n_samples=300,n_features=2,n_redundant=0,n_informative=2,       random_state=22,n_clusters_per_class=1,scale=100)
  8. plt.scatter(X[:,0],X[:,1],c=y)
  9. plt.show()
  10. ###利用minmax方式对数据进行规范化###
  11. X=preprocessing.minmax_scale(X)#feature_range=(-1,1)可设置重置范围
  12. X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
  13. clf=SVC()
  14. clf.fit(X_train,y_train)
  15. print(clf.score(X_test,y_test))
  16. #0.933333333333
  17. #没有规范化之前我们的训练分数为0.511111111111,规范化后为0.933333333333,准确度有很大提升
复制代码

7.交叉验证

交叉验证的基本头脑是将原始数据进行分组,一部分做为练习集来练习模子,另一部分做为测试集来评价模子。交叉验证用于评估模子的猜测性能,尤其是练习好的模子在新数据上的体现,可以在一定程度上减小过拟合。还可以从有限的数据中获取尽大概多的有用信息。
机器学习使命中,拿到数据后,我们起首会将原始数据集分为三部分:练习集、验证集和测试集。 练习集用于练习模子,验证集用于模子的参数选择配置,测试集对于模子来说是未知数据,用于评估模子的泛化本领。差别的划分会得到差别的终极模子。
以前我们是直接将数据分割成70%的练习数据和测试数据,现在我们利用K折交叉验证分割数据,起首将数据分为5组,然后再从5组数据之中选择差别数据进行练习。
  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.neighbors import KNeighborsClassifier
  4. ###引入数据###
  5. iris=load_iris()
  6. X=iris.data
  7. y=iris.target
  8. ###训练数据###
  9. X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
  10. #引入交叉验证,数据分为5组进行训练
  11. from sklearn.model_selection import cross_val_score
  12. knn=KNeighborsClassifier(n_neighbors=5)#选择邻近的5个点
  13. scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')#评分方式为accuracy
  14. print(scores)#每组的评分结果
  15. #[ 0.96666667 1.     0.93333333 0.96666667 1.    ]5组数据
  16. print(scores.mean())#平均评分结果
  17. #0.973333333333
复制代码
那么是否n_neighbor=5便是最好呢,我们来调解参数来看模子终极练习分数。
  1. from sklearn import datasets
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.neighbors import KNeighborsClassifier
  4. from sklearn.model_selection import cross_val_score#引入交叉验证
  5. import matplotlib.pyplot as plt
  6. ###引入数据###
  7. iris=datasets.load_iris()
  8. X=iris.data
  9. y=iris.target
  10. ###设置n_neighbors的值为1到30,通过绘图来看训练分数###
  11. k_range=range(1,31)
  12. k_score=[]
  13. for k in k_range:
  14.   knn=KNeighborsClassifier(n_neighbors=k)
  15.   scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')#for classfication
  16.   k_score.append(scores.mean())
  17. plt.figure()
  18. plt.plot(k_range,k_score)
  19. plt.xlabel('Value of k for KNN')
  20. plt.ylabel('CrossValidation accuracy')
  21. plt.show()
  22. #K过大会带来过拟合问题,我们可以选择12-18之间的值
复制代码
我们可以看到n_neighbor在12-18之间评分比力高,现实项目之中我们可以通过这种方式来选择差别参数。别的我们还可以选择
  1. 2-fold Cross Validation
复制代码
,
  1. Leave-One-Out Cross Validation
复制代码
等方法来分割数据,比力差别方法和参数得到最优效果。

我们将上述代码中的循环部分改变一下,评分函数改为
  1. neg_mean_squared_error
复制代码
,便得到对于差别参数时的丧失函数。
  1. for k in k_range:
  2.   knn=KNeighborsClassifier(n_neighbors=k)
  3.   loss=-cross_val_score(knn,X,y,cv=10,scoring='neg_mean_squared_error')# for regression
  4.   k_score.append(loss.mean())
复制代码

8.过拟合题目

什么是过拟合题目呢?例如下面这张图片,玄色线已经可以很好的分类出赤色点和蓝色点,但是在机器学习过程中,模子过于纠结正确度,便形成了绿色线的效果。然后在猜测测试数据集效果的过程中往往会浪费许多时间而且正确率不是太好。

我们先举例如何辨别overfitting题目。Sklearn.learning_curve中的learning curve可以很直观的看出Model学习的进度,对比发现有没有过拟合。
  1. from sklearn.model_selection import learning_curve
  2. from sklearn.datasets import load_digits
  3. from sklearn.svm import SVC
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. #引入数据
  7. digits=load_digits()
  8. X=digits.data
  9. y=digits.target
  10. #train_size表示记录学习过程中的某一步,比如在10%,25%...的过程中记录一下
  11. train_size,train_loss,test_loss=learning_curve(
  12.   SVC(gamma=0.1),X,y,cv=10,scoring='neg_mean_squared_error',
  13.   train_sizes=[0.1,0.25,0.5,0.75,1]
  14. )
  15. train_loss_mean=-np.mean(train_loss,axis=1)
  16. test_loss_mean=-np.mean(test_loss,axis=1)
  17. plt.figure()
  18. #将每一步进行打印出来
  19. plt.plot(train_size,train_loss_mean,'o-',color='r',label='Training')
  20. plt.plot(train_size,test_loss_mean,'o-',color='g',label='Cross-validation')
  21. plt.legend('best')
  22. plt.show()
复制代码

假如我们改变gamma的值,那么会改变相应的Loss函数。丧失函数便在10左右停留,此时便能直观的看出过拟合。


下面我们通过修改gamma参数来修正过拟合题目。
  1. from sklearn.model_selection import validation_curve#将learning_curve改为validation_curve
  2. from sklearn.datasets import load_digits
  3. from sklearn.svm import SVC
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. #引入数据
  7. digits=load_digits()
  8. X=digits.data
  9. y=digits.target
  10. #改变param来观察Loss函数情况
  11. param_range=np.logspace(-6,-2.3,5)
  12. train_loss,test_loss=validation_curve(
  13.   SVC(),X,y,param_name='gamma',param_range=param_range,cv=10,
  14.   scoring='neg_mean_squared_error'
  15. )
  16. train_loss_mean=-np.mean(train_loss,axis=1)
  17. test_loss_mean=-np.mean(test_loss,axis=1)
  18. plt.figure()
  19. plt.plot(param_range,train_loss_mean,'o-',color='r',label='Training')
  20. plt.plot(param_range,test_loss_mean,'o-',color='g',label='Cross-validation')
  21. plt.xlabel('gamma')
  22. plt.ylabel('loss')
  23. plt.legend(loc='best')
  24. plt.show()
复制代码
通过改变差别的gamma值我们可以看到Loss函数的变革情况。从图中可以看到,假如gamma的值大于0.001便会出现过拟合的题目,那么我们构建模子时gamma参数设置应该小于0.001。

9.保存模子

我们花费很长时间用来练习数据,调解参数,得到最优模子。但假如改变平台,我们还必要重新练习数据和修正参数来得到模子,将会非常的浪费时间。此时我们可以先将model保存起来,然后便可以很方便的将模子迁徙。
  1. from sklearn import svm
  2. from sklearn import datasets
  3. #引入和训练数据
  4. iris=datasets.load_iris()
  5. X,y=iris.data,iris.target
  6. clf=svm.SVC()
  7. clf.fit(X,y)
  8. #引入sklearn中自带的保存模块
  9. from sklearn.externals import joblib
  10. #保存model
  11. joblib.dump(clf,'sklearn_save/clf.pkl')
  12. #重新加载model,只有保存一次后才能加载model
  13. clf3=joblib.load('sklearn_save/clf.pkl')
  14. print(clf3.predict(X[0:1]))
  15. #存放model能够更快的获得以前的结果
复制代码
参考链接

此文档整理自莫烦sklearn视频教程,链接为https://morvanzhou.github.io/tutorials/machine-learning/sklearn/。

到此这篇关于Python之Sklearn使用入门教程的文章就介绍到这了,更多相干Sklearn 入门内容请搜索草根技术分享以前的文章或继续欣赏下面的相干文章盼望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作