网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一个方面。其实最好的教程就是官方文档(http://scikit-learn.org/stable/),但是官方文档讲述的太过于详细,同时很多人对官方文档的理解和结构认识上都不能很好的把握。我写这篇文章的目的是想用一篇文章讲清楚整个sklearn库,我会讲清楚怎么样用这个库,而不是讲清楚每一个知识点。(授人以鱼不如授人以渔)(本文很多都是从实践的角度出发,也仅仅只代表我个人的认识)
本篇文章主要从两个方面出发:1,介绍sklearn官方文档的类容和结构;2,从机器学习重要步骤出发讲清楚sklearn的使用方法。
一、sklearn官方文档的类容和结构
1,机器学习的认识:从实践的角度出发,机器学学习要做的工作就是在我们有的一个数据集上建立一个或者多个模型,然后对我们的模型进行优化和评估。我们将会在sklearn中看到下图各个模块到底是什么,怎么用。
2,sklearn库官方文档结构:
下图表示:官方文档有很多模块:
tutorials:是一个官方教程,可以理解快速上手教程,但是看完感觉并没有很快。
user guide(用户指南):这里对每一个算法有详细的介绍
API:这里是库调用的方法
FAQ:常见问题
contributing:贡献,还介绍最新的一些代码,功能。
(下面三个就跟没有用了)
总结:一般的做法是API里面找到你要调用的方法,然后可以查看方法参数的情况和使用情况。也可以在指南里面找到具体的解释。
3,sklearn库的结构:
(1)结构:
由图中,可以看到库的算法主要有四类:分类,回归,聚类,降维。其中:
- 常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
- 常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
- 常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN
- 常用降维:LinearDiscriminantAnalysis、PCA
(2)图片中隐含的操作流程:
这个流程图代表:蓝色圆圈内是判断条件,绿色方框内是可以选择的算法。你可以根据自己的数据特征和任务目标去找到一条自己的操作路线,一步步做就好了。
二、机器学习主要步骤中sklearn应用
1,数据集:面对自己的任务肯定有自己的数据集,但是对于学习来说,sklearn提供了一些数据,主要有两部分:现在网上一些常用的数据集,可以通过方法加载;另一种sklearn可以生成数据,可以生成你设定的数据。(设定规模,噪声等)
下面是一段python实例:
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#使用以后的数据集进行线性回归(这里是波士顿房价数据)
loaded_data=datasets.load_boston()
data_X=loaded_data.data
data_y=loaded_data.target
model=LinearRegression()
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])
#使用生成线性回归的数据集,最后的数据集结果用散点图表示
X,y=datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=10) #n_samples表示样本数目,n_features特征的数目 n_tragets noise噪音
plt.scatter(X,y)
plt.show()
2,数据预处理:数据预处理包括:降维、数据归一化、特征提取和特征转换(one-hot)等,这在sklearn里面有很多方法,具体查看api。这里用归一化(preprocessing.scale() )例子解释一下:
from sklearn import preprocessing #进行标准化数据时,需要引入个包
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as 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)
#X=preprocessing.minmax_scale(X,feature_range=(-1,1))
X=preprocessing.scale(X) #0.966666666667 没有 0.477777777778
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))
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()
a=np.array([[10,2.7,3.6],
[-100,5,-2],
[120,20,40]],dtype=np.float64) #每一列代表一个属性
print(a) #标准化之前a
print(preprocessing.scale(a)) #标准化之后的a
3,选择模型并训练: sklearn里面有很多的机器学习方法,可以查看api找到你需要的方法,sklearn统一了所有模型调用的api,使用起来还是比较简单。
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#使用以后的数据集进行线性回归
loaded_data=datasets.load_boston()
data_X=loaded_data.data
data_y=loaded_data.target
model=LinearRegression()
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])
#参数
print(model.coef_) #如果y=0.1x+0.3 则此行输出的结果为0.1
print(model.intercept_) #此行输出的结果为0.3
print(model.get_params()) #模型定义时定义的参数,如果没有定义则返回默认值
print(model.score(data_X,data_y)) #给训练模型打分,注意用在LinearR中使用R^2 conefficient of determination打分
4,模型评分:
(1)模型的score方法:最简单的模型评估方法是调用模型自己的方法:
#预测
y_predict = knnClf.predict(x_test)
print("score on the testdata:",knnClf.score(x_test,y_test))
(2)sklearn的指标函数:库提供的一些计算方法,常用的有classification_report方法
下面是一个svm分类器,是关于图片分类的,具体数据这里没有给出,大家只需要关注模型的评估就好。
def svmClassify(x_train, x_test, y_train, y_test):
id = range(1, x_test.shape[0]+1)
print("start run svm!")
#训练
svc = svm.SVC(kernel='rbf', C=10,probability=True)
svc.fit(x_train, y_train)
#预测
y_predict = svc.predict(x_test)
print("svm mode's score on the test data:",svc.score(x_test,y_test))
print("svm mode's evaluate:",classification_report(y_test,y_predict))
# print(svc.coef_) # 如果y=0.1x+0.3 则此行输出的结果为0.1
# print(svc.intercept_) # 此行输出的结果为0.3
print(svc.get_params()) # 模型定义时定义的参数,如果没有定义则返回默认值
#可能性计算
probablity = svc.predict_proba(x_test)
list_pro = []
for i in range(probablity.shape[0]):
pro = max(list(probablity[i]))
list_pro.append(pro)
#输出
index = np.array(id).reshape(-1,1)
result = pd.DataFrame(np.column_stack((np.array(id).reshape(-1, 1), np.array(y_test).reshape(-1, 1),np.array(y_predict).reshape(-1,1),np.array(list_pro).reshape(-1,1))),
columns=['ImageId','test_label','predict_lable','probablity'])
result.to_csv("result/svm_result.csv", index=False, header=True, encoding='gbk')
diff_index = []
for i in range(result.shape[0]):
# print(result['test_label'][i], result['predict_lable'][i],)
diff_index.append(result['test_label'][i] != result['predict_lable'][i])
print(diff_index)
diff = result[diff_index]
diff_x = x_test_original[diff_index]
diff.to_csv('result/svm_result_diff.csv', index=False, header=True, encoding='gbk')
# 查看每个错误
for i in range(len(diff_index)):
# print("label is:",diff['test_label'][i],"predict is:",diff['predict_lable'][i])
print("test label is :", diff.iloc[i]['test_label'], 'predict label is :', diff.iloc[i]['predict_lable'])
x = diff_x[i]
img = x.reshape(28, 28)
image_show(img)
(3)sklearn也支持自己开发评价方法
5,模型的保存于恢复:模型的保存与恢复可以采用python的pickle,也可以用joblib的方法。
from sklearn import svm
from sklearn import datasets
clf=svm.SVC()
iris=datasets.load_iris()
X,y=iris.data,iris.target
clf.fit(X,y)
#method1:pickle
import pickle
#save
with open('save/clf.pickle','wb')as f:
pickle.dump(clf,f)
#restore
with open('save/clf.pickle','rb') as f:
clf=pickle.load(f)
print(clf.predict(X[0:1]))
#method2:joblib
from sklearn.externals import joblib
#save
joblib.dump(clf,'save/clf.pkl')
clf3=joblib.load('save/clf.pkl')
print(clf3.predict(X[0:1]))
这是一篇入门的文章,希望入门的人有一个很好的引导,接下来我也会跟新一些重要的内容。下一篇,我打算讲解交叉验证这个很重要的模块。
前言
sklearn想必不用我多介绍了,一句话,她是机器学习领域中最知名的python模块之一,若想要在机器学习领域有一番建树,必绕不开sklearn
sklearn的官网链接http://scikit-learn.org/stable/index.html#
首先,放上一张官网上的sklearn的结构图:
目录
1. 分类、回归
2. 降维
3. 模型评估与选择
4. 数据预处理
大类 小类 适用问题 实现 说明
分类、回归
1.1 广义线性模型 1.1.1 普通最小二乘法 回归 sklearn.linear_model.LinearRegression
注:本节中所有的回归模型皆为线性回归模型 1.1.2 Ridge/岭回归 回归 sklearn.linear_model.Ridge 解决两类回归问题:
一是样本少于变量个数
二是变量间存在共线性
1.1.3 Lasso 回归 sklearn.linear_model.Lasso 适合特征较少的数据
1.1.4 Multi-task Lasso 回归 sklearn.linear_model.MultiTaskLasso y值不是一元的回归问题
1.1.5 Elastic Net 回归 sklearn.linear_model.ElasticNet 结合了Ridge和Lasso
1.1.6 Multi-task Elastic Net 回归 sklearn.linear_model.MultiTaskElasticNet y值不是一元的回归问题
1.1.7 Least Angle Regression(LARS) 回归 sklearn.linear_model.Lars 适合高维数据
1.1.8 LARS Lasso 回归 sklearn.linear_model.LassoLars (1)适合高维数据使用
(2)LARS算法实现的lasso模型
1.1.9 Orthogonal Matching Pursuit (OMP) 回归 sklearn.linear_model.OrthogonalMatchingPursuit 基于贪心算法实现
1.1.10 贝叶斯回归 回归 sklearn.linear_model.BayesianRidge
sklearn.linear_model.ARDRegression 优点: (1)适用于手边数据(2)可用于在估计过程中包含正规化参数
缺点:耗时
1.1.11 Logistic regression 分类 sklearn.linear_model.LogisticRegression
1.1.12 SGD(随机梯度下降法) 分类
/回归 sklearn.linear_model.SGDClassifier
sklearn.linear_model.SGDRegressor 适用于大规模数据
1.1.13 Perceptron 分类 sklearn.linear_model.Perceptron 适用于大规模数据
1.1.14 Passive Aggressive Algorithms 分类
/回归 sklearn.linear_model.
PassiveAggressiveClassifier
sklearn.linear_model.
PassiveAggressiveRegressor 适用于大规模数据
1.1.15 Huber Regression 回归 sklearn.linear_model.HuberRegressor 能够处理数据中有异常值的情况
1.1.16 多项式回归 回归 sklearn.preprocessing.PolynomialFeatures 通过PolynomialFeatures将非线性特征转化成多项式形式,再用线性模型进行处理
1.2 线性和二次判别分析 1.2.1 LDA 分类/降维 sklearn.discriminant_analysis.
LinearDiscriminantAnalysis
1.2.2 QDA 分类 sklearn.discriminant_analysis.
QuadraticDiscriminantAnalysis
1.3 核岭回归 简称KRR 回归 sklearn.kernel_ridge.KernelRidge 将核技巧应用到岭回归(1.1.2)中,以实现非线性回归
1.4 支持向量机 1.4.1 SVC,NuSVC,LinearSVC 分类 sklearn.svm.SVC
sklearn.svm.NuSVC
sklearn.svm.LinearSVC SVC可用于非线性分类,可指定核函数;
NuSVC与SVC唯一的不同是可控制支持向量的个数;
LinearSVC用于线性分类
1.4.2 SVR,NuSVR,LinearSVR 回归 sklearn.svm.SVR
sklearn.svm.NuSVR
sklearn.svm.LinearSVR 同上,将"分类"变成"回归"即可
1.4.3 OneClassSVM 异常检测 sklearn.svm.OneClassSVM 无监督实现异常值检测
1.5 随机梯度下降 同1.1.12
1.6 最近邻 1.6.1 Unsupervised Nearest Neighbors – sklearn.neighbors.NearestNeighbors 无监督实现K近邻的寻找
1.6.2 Nearest Neighbors Classification 分类 sklearn.neighbors.KNeighborsClassifier
sklearn.neighbors.RadiusNeighborsClassifier (1)不太适用于高维数据
(2)两种实现只是距离度量不一样,后者更适合非均匀的采样
1.6.3 Nearest Neighbors Regression 回归 sklearn.neighbors.KNeighborsRegressor
sklearn.neighbors.RadiusNeighborsRegressor 同上
1.6.5 Nearest Centroid Classifier 分类 sklearn.neighbors.NearestCentroid 每个类对应一个质心,测试样本被分类到距离最近的质心所在的类别
1.7 高斯过程(GP/GPML) 1.7.1 GPR 回归 sklearn.gaussian_process.
GaussianProcessRegressor 与KRR一样使用了核技巧
1.7.3 GPC 分类 sklearn.gaussian_process.
GaussianProcessClassifier
1.8 交叉分解 实现算法:CCA和PLS – – 用来计算两个多元数据集的线性关系,当预测数据比观测数据有更多的变量时,用PLS更好
1.9 朴素贝叶斯 1.9.1 高斯朴素贝叶斯 分类 sklearn.naive_bayes.GaussianNB 处理特征是连续型变量的情况
1.9.2 多项式朴素贝叶斯 分类 sklearn.naive_bayes.MultinomialNB 最常见,要求特征是离散数据
1.9.3 伯努利朴素贝叶斯 分类 sklearn.naive_bayes.BernoulliNB 要求特征是离散的,且为布尔类型,即true和false,或者1和0
1.10 决策树 1.10.1 Classification 分类 sklearn.tree.DecisionTreeClassifier
1.10.2 Regression 回归 sklearn.tree.DecisionTreeRegressor
1.11 集成方法 1.11.1 Bagging 分类/回归 sklearn.ensemble.BaggingClassifier
sklearn.ensemble.BaggingRegressor 可以指定基学习器,默认为决策树
注:1和2属于集成方法中的并行化方法,3和4属于序列化方法 1.11.2 Forests of randomized trees 分类/回归 RandomForest(RF,随机森林):
sklearn.ensemble.RandomForestClassifier
sklearn.ensemble.RandomForestRegressor
ExtraTrees(RF改进):
sklearn.ensemble.ExtraTreesClassifier
sklearn.ensemble.ExtraTreesRegressor 基学习器为决策树
1.11.3 AdaBoost 分类/回归 sklearn.ensemble.AdaBoostClassifier
sklearn.ensemble.AdaBoostRegressor 可以指定基学习器,默认为决策树
号外:最近特别火的两个梯度提升算法,LightGBM和XGBoost
(XGBoost提供了sklearn接口) 1.11.4 Gradient Tree Boosting 分类/回归 GBDT:
sklearn.ensemble.GradientBoostingClassifier
GBRT:
sklearn.ensemble.GradientBoostingRegressor 基学习器为决策树
1.11.5 Voting Classifier 分类 sklearn.ensemble.VotingClassifier 须指定基学习器
1.12 多类与多标签算法 – – – sklearn中的分类算法都默认支持多类分类,其中LinearSVC、 LogisticRegression和GaussianProcessClassifier在进行多类分类时需指定参数multi_class
1.13 特征选择 1.13.1 过滤法之方差选择法 特征选择 sklearn.feature_selection.VarianceThreshold 特征选择方法分为3种:过滤法、包裹法和嵌入法。过滤法不用考虑后续学习器
1.13.2 过滤法之卡方检验 特征选择 sklearn.feature_selection.SelectKBest
1.13.3 包裹法之递归特征消除法 特征选择 sklearn.feature_selection.RFE 包裹法需考虑后续学习器,参数中需输入基学习器
1.13.4 嵌入法 特征选择 sklearn.feature_selection.SelectFromModel 嵌入法是过滤法和嵌入法的结合,参数中也需输入基学习器
1.14 半监督 1.14.1 Label Propagation 分类/回归 sklearn.semi_supervised.LabelPropagation
sklearn.semi_supervised.LabelSpreading
1.15 保序回归 – 回归 sklearn.isotonic.IsotonicRegression
1.16 概率校准 – – – 在执行分类时,获得预测的标签的概率
1.17 神经网络模型 (待写)
降维
2.5 降维 2.5.1 主成分分析 降维 PCA:
sklearn.decomposition.PCA
IPCA:
sklearn.decomposition.IncrementalPCA
KPCA:
sklearn.decomposition.KernelPCA
SPCA:
sklearn.decomposition.SparsePCA (1)IPCA比PCA有更好的内存效率,适合超大规模降维。
(2)KPCA可以进行非线性降维
(3)SPCA是PCA的变体,降维后返回最佳的稀疏矩阵
2.5.2 截断奇异值分解 降维 sklearn.decomposition.TruncatedSVD 可以直接对scipy.sparse矩阵处理
2.5.3 字典学习 – sklearn.decomposition.SparseCoder
sklearn.decomposition.DictionaryLearning SparseCoder实现稀疏编码,DictionaryLearning实现字典学习
模型评估与选择
3.1 交叉验证/CV 3.1.1 分割训练集和测试集 – sklearn.model_selection.train_test_split
3.1.2 通过交叉验证评估score – sklearn.model_selection.cross_val_score score对应性能度量,分类问题默认为accuracy_score,回归问题默认为r2_score
3.1.3 留一法LOO – sklearn.model_selection.LeaveOneOut CV的特例
3.1.4 留P法LPO – sklearn.model_selection.LeavePOut CV的特例
3.2 调参 3.2.1 网格搜索 – sklearn.model_selection.GridSearchCV 最常用的调参方法。可传入学习器、学习器参数范围、性能度量score(默认为accuracy_score或r2_score )等
3.2.2 随机搜索 – sklearn.model_selection.RandomizedSearchCV 参数传入同上
3.3 性能度量 3.3.1 分类度量 – – 对应交叉验证和调参中的score
3.3.2 回归度量 – –
3.3.3 聚类度量 – –
3.4 模型持久性 – – – 使用pickle存放模型,可以使模型不用重复训练
3.5 验证曲线 3.5.1 验证曲线 – sklearn.model_selection.validation_curve 横轴为某个参数的值,纵轴为模型得分
3.5.2 学习曲线 – sklearn.model_selection.learning_curve 横轴为训练数据大小,纵轴为模型得分
数据预处理
4.3 数据预处理 4.3.1 标准化 数据预处理 标准化:
sklearn.preprocessing.scale
sklearn.preprocessing.StandardScaler scale与StandardScaler都是将将特征转化成标准正态分布(即均值为0,方差为1),且都可以处理scipy.sparse矩阵,但一般选择后者
数据预处理
区间缩放:
sklearn.preprocessing.MinMaxScaler
sklearn.preprocessing.MaxAbsScale MinMaxScaler默认为0-1缩放,MaxAbsScaler可以处理scipy.sparse矩阵
4.3.2 非线性转换 数据预处理 sklearn.preprocessing.QuantileTransformer 可以更少的受异常值的影响
4.3.3 归一化 数据预处理 sklearn.preprocessing.Normalizer 将行向量转换为单位向量,目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准
4.3.4 二值化 数据预处理 sklearn.preprocessing.Binarizer 通过设置阈值对定量特征处理,获取布尔值
4.3.5 哑编码 数据预处理 sklearn.preprocessing.OneHotEncoder 对定性特征编码。也可用pandas.get_dummies实现
4.3.6 缺失值计算 数据预处理 sklearn.preprocessing.Imputer 可用三种方式填充缺失值,均值(默认)、中位数和众数。也可用pandas.fillna实现
4.3.7 多项式转换 数据预处理 sklearn.preprocessing.PolynomialFeatures
4.3.8 自定义转换 数据预处理 sklearn.preprocessing.FunctionTransformer
我的github上也有,欢迎大家去看
https://blog.csdn.net/GitChat/article/details/79396231