Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、
降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)方法。
常用的回归:线性、决策树、SVM、KNN;集成回归:随机森林,Adaboost、GradientBoosting、Bagging、ExtraTrees
常用的分类:线性、决策树、SVM、KNN、朴素贝叶斯;集成分类:随机森林,Adaboost、GradientBoosting、Bagging、ExtraTrees
常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN
常用降维:LinearDiscriminantAnalysis、PCA
特点:
安装命令:pip install scikit-learn
写入.csv
一般,我们参加比赛会把最后的模型结果写入.csv文件,提交。
#生成一个样本对应ID,假设是1-45的序号
ind=[]
for i in range(45):
ind.append(i+1)
#回顾Pandas中的数据框
import pandas as pd
dic={'id':ind,'pred':y_pred}#y_pred表示模型预测的结果
test_pred=pd.DataFrame(dic)
test_pred.head()
#将数据框写入.csv文件中
test_pred.to_csv('knn_iris.csv',index=False)
from sklearn import preprocessing
import numpy as np
a=np.array([[10,2.7,3.6],[-100,5,-2],[120,20,40]],dtype=np.float64)
print("标准化前的数据",a)
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]]
X_pre=X
y_pre=y
X_train_pre,X_test_pre,y_train_pre,y_test_pre=train_test_split(X_pre,y_pre,test_size=0.3)
clf=SVC()
clf.fit(X_train_pre,y_train_pre)
print(clf.score(X_test_pre,y_test_pre))
结果:0.522222222223
#利用minmax方式对数据进行规范化
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.fit(X_train,y_train)
print(clf.score(X_test,y_test))
结果:0.9111111111
总结:可以看到数据规范化之前的模型分数为0.5222,数据规范化之后模型分数为0.9111。
交叉验证的思想就是重复的使用数据,把得到的样本数据几星切分,组合成为不同的训练集和验证集,用训练集来训练模型,用验证集评估模型预测的好坏。
简单的交叉验证
随机的将样本数据分为两部分(如70%训练,30%测试),然后用训练集来训练模型,在验证集上验证模型及参数;接着再把样本打乱,重新选择训练集和验证集,重新训练验证,最后选择损失函数评估最优的模型和参数。
K折交叉验证
随机将样本数均分为K份,每次随机选择其中的k-1份作为训练集,剩下的1份做验证集。当这一轮完成后,重新随机选择k-1份来训练数据,重新随机选择k-1份来训练数据,若干轮后选择损失函数评估最优的模型和参数。
留一交叉验证
留一交叉验证是k折交叉验证的一种特例,此时k=n(样本的个数),每次选择n-1个样本进行训练,留一个样本进行验证模型的好坏(这种方法适合样本量非常少的情况)。
boostrapping自助采样
这种方法也是随机森林训练样本采用的方法。在n个样本中随机有放回抽样m个样本作为一棵树的一个训练集,这种采用会大约有1/3的样本不被才到,这些不被采到的样本就会被作为这棵树的杨征集。
#交叉验证
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score#导入交叉验证
#加载数据
iris=load_iris()
X=iris.data
y=iris.data
y=iris.target
#训练数据
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
knn=KNeighborsClassifier(n_neighbors=5)#选择邻近的5个点
scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')#5折交叉验证,评分方式为accuracy
print(scores)#每组的评分结果
print(scores.mean())
结果:
[0.9666667 1. 0.933333 0.9666667]
0.9733333334