本文主要介绍了Python中Sklearn的入门教程,通过示例代码介绍的非常详细,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。
1.Sklearn简介
Sci-learn (sklearn)是机器学习中常用的第三方模块,封装了常用的机器学习方法,包括回归、降维、分类、聚类等。当面对机器学习的问题时,我们可以根据下图选择相应的方法。Sklearn有以下特点:
简单高效的数据挖掘和数据分析工具
让每个人都能够在复杂的环境中重用它。
在NumPy,Scipy,MatPlotLib上创建
2.Sklearn安装
Sklearn安装需要Python(=2.7 or=3.3)、NumPy (=1.8.2)、SciPy (=0.13.3)。你可以使用pip install-u scikit-learn来安装scikit-learn如果NumPy和SciPy已经安装。
3.Sklearn通用学习模式
Sklearn包含了很多机器学习方法,但是所有的学习方法都大致相同。这里介绍一下Sklearn的一般学习模式。首先介绍要训练的数据。Sklearn自带一些数据集,也可以通过相应的方法来构造。4.我们将介绍如何在4中构造数据。Sklearn数据集。然后选择相应的机器学习方法进行训练。在训练过程中,可以通过一些技巧来调整参数,使得学习精度更高。模型训练完成后,可以预测新的数据,然后我们可以通过MatPlotLib等方法直观的显示数据。另外可以保存我们训练好的模型,方便迁移到其他平台,不需要重新训练。
从sklearn导入datasets#引入数据集,sklearn包含很多数据集。
从sklearn.model _ selection导入train _ test _ split #将数据分为测试集和训练集。
来自sklearn。邻居通过邻近点导入kneighborsclassifier #训练数据
# # #介绍数据# # #
Iris=datasets.load_iris()# iris虹膜数据介绍,它包含四个特征变量。
Iris_X=iris.data#特征变量
Iris_y=iris.target#目标值
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%。
Print(y_train)#我们看到训练数据的特征值分为3类
'''
[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
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
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
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
2 2]
'''
# # #训练数据# # #
KN=kneighborsclassifier()#介绍训练方法
Knn.fit(X_train,y_train)#填写测试数据进行训练。
# # #预测数据# # #
Print(knn.predict(X_test))#预测特征值
'''
[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
1 2 1 0 0 1 0 2]
'''
Print(y_test)#真特征值
'''
[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
1 2 1 0 0 1 0 2]
'''
4.Sklearn datasets
Sklearn提供了一些标准数据,我们就不用再去找其他网站的数据进行训练了。比如我们用来训练的load_iris数据,可以很容易的返回数据特征变量和目标值。除了引入数据,还可以通过load_sample_images()引入图片。
除了sklearn提供的一些数据,我们也可以自己构造一些数据来帮助我们学习。
从sklearn导入数据集#导入数据集
#施工的各种参数可以根据自己的需要进行调整。
x,y=datasets . make _ regression(n _ samples=100,n_features=1,n_targets=1,noise=1)
# # #绘制构造的数据# # #
将matplotlib.pyplot作为plt导入
图表()
平面散点图(X,y)
plt.show()
5.Sklearn Model的属性和功能
数据训练完成后,得到模型。我们可以根据不同的模型得到相应的属性和函数,输出得到直观的结果。如果线性回归训练后得到线性函数y=0.3x 1,我们可以得到模型的系数为0.3 through _coef,模型的截距为1 through _intercept。
从sklearn导入数据集
Fromsklearn.linear _ model导入线性回归#引入线性回归模型
# # #介绍数据# # #
load_data=datasets.load_boston()
数据X=加载数据
数据y=加载数据目标
打印(data_X.shape)
#(506,13)data_X有13个特征变量。
# # #训练数据# # #
模型=线性回归()
model.fit(数据X,数据y)
Model.predict(data_X[:4,)#预测前4个数据
# # #属性和功能# # #
打印(model.coef_)
'''
2.08602395e-02 2.68856140e 00
-1.77957587 e 01 3.80475246 e 00 7.51061703 e-04-1.47575880 e 00
3.05655038 e-01-1.23293463 e-02-9.53463555 e-01 9.39251272 e-03
-5.25466633e-01]
'''
print(model.intercept_)
#36.4911032804
Print(model.get_params())#获取模型的参数
#{'copy_X': True,' normalize': False,' n_jobs': 1,' fit_intercept': True}
Print (model.score (data _ x,data _ y)) #对训练进行评分。
#0.740607742865
6.Sklearn数据预处理
数据集的标准化是大多数机器学习算法的例行要求。如果单个特征或多或少不接近标准的正态分布,它可能在项目中表现不好。在实际情况中,我们往往忽略特征的分布形状,直接去掉均值来居中一个特征,然后除以非恒定特征的标准差来进行缩放。
例如,在很多学习算法中,目标函数是建立在假设所有特征都是零均值且具有同阶方差(如径向基函数、支持向量机和L1L2正则项等)的基础上的。).如果一个特征的方差比其他特征的方差大几个数量级,那么它就会在学习算法中占据主导地位,导致学习者无法像预期的那样从其他特征中学习。比如我们可以通过尺度把数据尺度化,实现标准化。
从sklearn导入预处理
将numpy作为np导入
a=np.array([[10,2.7,3.6),
[-100,5,-2],
[120,20,40]],dtype=np.float64)
打印(一份)
Print(preprocessing.scale(a))#减少值的差异。
'''
[[ 10.2.7 3.6]
[-100.5.-2.]
[ 120.20.40
[[ 0.-0.85170713 -0.55138018]
[-1.22474487 -0.55187146 -0.852133 ]
[ 1.22474487 1.40357859 1.40351318]]
'''
我们来看看预处理前后的区别。预处理前的模型得分为0.51111111111,预处理后的模型得分为0.933333333。可以看出,预处理大大提高了模型得分。
从sklearn.model_selection导入训练_测试_拆分
从sk learn . datasets . samples _ generator导入make_classification
从sklearn.svm导入SVC
将matplotlib.pyplot作为plt导入
# # #生成的数据如下图所示# # #
平面图
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)
plt.scatter(X[:0],X[:1],c=y)
plt.show()
# # #用最小最大值法标准化数据# # #
x=preprocessing . minmax _ scale(x)# feature _ range=(-1,1)设置重置范围。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
clf=SVC()
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))
#0.933333333333
#归一化前,我们的训练分数是0.511111111111,归一化后是0.933333333,大大提高了准确率。
7.交叉验证
交叉验证的基本思想是将原始数据分组,一部分作为训练集训练模型,另一部分作为测试集评估模型。交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的性能,可以在一定程度上减少过拟合。也可以从有限的数据中获取尽可能多的有效信息。
在机器学习任务中,得到数据后,我们会先把原始数据集分成三部分:训练集、验证集和测试集。训练集用于训练模型,验证集用于模型的参数选择和配置,测试集是模型的未知数据,用于评估模型的泛化能力。不同的划分会导致不同的最终模型。
以前我们直接把数据分为70%的训练数据和测试数据。现在,我们使用K-fold交叉验证来拆分数据。首先,我们将数据分成五组,然后从五组中选择不同的数据进行训练。
从sklearn.datasets导入load_iris
从sklearn.model_selection导入训练_测试_拆分
从sklearn.neighbors导入KNeighborsClassifier
# # #介绍数据# # #
iris=load_iris()
X=iris.data
y=虹膜.目标
# # #训练数据# # #
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
#引入交叉验证,将数据分为5组进行训练。
从sklearn.model_selection导入cross_val_score
KNEIGHBORSCLASSIFIER(n _ neighbors=5)#选择五个相邻的点。
Scores=cross _ val _ score (KNN,x,y,CV=5,计分='准确度')#计分方法是准确度
打印(分数)#每组的分数结果
# [0.9666667 1.0.933333 0.66667 1.] 5组数据
Print(scores.mean())#平均分数结果
#0.973333333333
那么n_neighbor=5是最好的吗?我们来调整参数,看看模型最终的训练分数。
从sklearn导入数据集
从sklearn.model_selection导入训练_测试_拆分
从sklearn.neighbors导入KNeighborsClassifier
Fromsklearn.model _ selection导入cross _ val _ score #引入交叉验证
将matplotlib.pyplot作为plt导入
# # #介绍数据# # #
iris=datasets.load_iris()
X=iris.data
y=虹膜.目标
# # #将n_neighbors的值设置为1到30,通过绘制# # #来查看训练分数
k_range=range(1,31)
k_score=[]
对于k_range中的k:
KNN=KNeighborsClassifier(n _ neighbors=k)
scores=cross_val_score(knn,X,y,cv=10,scoring=' accuracy ')#用于分类
k_score.append(scores.mean())
图表()
plt.plot(k_range,k_score)
PLT . xlabel(' KNN的k值')
plt.ylabel(“交叉验证准确性”)
plt.show()
过多的#K会带来拟合问题,我们可以在12到18之间选择一个值。
我们可以看到n_neighbor在12到18之间的分数很高,我们可以通过这种方式在实际项目中选择不同的参数。此外,我们还可以选择2重交叉验证、留一交叉验证等方法对数据进行分割,比较不同的方法和参数,得到最好的结果。
我们把上面代码的循环部分改一下,把评分函数改成neg_mean_squared_error,得到不同参数的损失函数。
对于k_range中的k:
KNN=KNeighborsClassifier(n _ neighbors=k)
loss=-cross_val_score(knn,X,y,cv=10,scoring=' neg _ mean _ squared _ error ')#用于回归
k_score.append(loss.mean())
8.过拟合问题
什么是过拟合问题?比如下图,黑线已经可以很好的对红点和蓝点进行分类,但是在机器学习的过程中,模型过于纠结于精度,导致了绿线的结果。然后在预测测试数据集结果的过程中,往往会浪费大量的时间,准确率也不是很好。
先举例说明如何识别overfitting问题。Sklearn.learning_curve中的学习曲线可以直观的看到模型学习的进度,比较有没有拟合。
从sklearn.model_selection导入学习曲线
从sklearn.datasets导入load_digits
从sklearn.svm导入SVC
将matplotlib.pyplot作为plt导入
将numpy作为np导入
#介绍数据
digits=load_digits()
x=数字.数据
y=数字。目标
#train_size表示记录学习过程中的某一步,如10%、25%.
训练大小,训练损失,测试损失=学习曲线(
SVC(gamma=0.1),X,y,cv=10,scoring=' neg _ mean _ squared _ error ',
train _ size=[0.1,0.25,0.5,0.75,1]
)
train _ loss _ mean=-NP . mean(train _ loss,axis=1)
test _ loss _ mean=-NP . mean(test _ loss,轴=1)
图表()
#打印出每个步骤。
plt.plot(train_size,train_loss_mean,' o-',color='r ',label='Training ')
plt.plot(train_size,test_loss_mean,' o-',color='g ',label='Cross-validation ')
plt.legend(“最佳”)
plt.show()
如果我们改变的值,我们将改变相应的损失函数。函数的损失停留在10左右,然后可以直观的看到过拟合。
让我们修改gamma参数来纠正过度拟合问题。
Fromsklearn.model _ selection导入验证曲线#将学习曲线更改为验证曲线
从sklearn.datasets导入load_digits
从sklearn.svm导入SVC
将matplotlib.pyplot作为plt导入
将numpy作为np导入
#介绍数据
digits=load_digits()
x=数字.数据
y=数字。目标
#更改参数以观察损失函数。
param_range=np.logspace(-6,-2.3,5)
train_loss,test _ loss=验证曲线(
SVC(),X,y,param_name='gamma ',param_range=param_range,cv=10,
得分='负均方误差'
)
train _ loss _ mean=-NP . mean(train _ loss,axis=1)
test _ loss _ mean=-NP . mean(test _ loss,轴=1)
图表()
plt.plot(param_range,train_loss_mean,' o-',color='r ',label='Training ')
plt.plot(param_range,test_loss_mean,' o-',color='g ',label='交叉验证')
plt.xlabel('gamma ')
plt.ylabel(“损失”)
plt.legend(loc='best ')
plt.show()
通过改变不同的伽马值,我们可以看到损失函数的变化。从图中可以看出,如果gamma的值大于0.001,就会出现过拟合的问题,所以我们在建立模型的时候gamma的参数设置应该小于0.001。
9.保存模型
我们要花很长时间来训练数据,调整参数,得到最优模型。但是如果换个平台,还是需要重新训练数据,修正参数才能得到模型,这样会很浪费时间。此时,我们可以先保存模型,然后我们可以轻松地迁移模型。
从sklearn导入svm
从sklearn导入数据集
#介绍和培训数据
iris=datasets.load_iris()
x,y=虹膜.数据,虹膜.目标
clf=svm。SVC()
clf.fit(X,y)
#介绍sklearn附带的保存模块
从sklearn.externals导入作业库
#保存模型
joblib.dump(clf,' sklearn_save/clf.pkl ')
#重新加载模型,只能在保存一次后加载模型
cl F3=joblib . load(' sk learn _ save/clf . pkl ')
print(clf3.predict(X[0:1])
#存储模型可以更快地得到以前的结果。
参考链接
本文编译自莫凡sklearn视频教程,链接https://morvanzhou . github . io/tutorials/machine-learning/sk learn/。
关于Python中Sklearn入门教程的这篇文章到此为止。更多相关Sklearn介绍内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。