https://github.com/fuqiuai/learning_notes/blob/master/sklearn%E5%AD%A6%E4%B9%A0.md

目录

sklearn 模型选择官方图 https://scikit-learn.org/stable/tutorial/machine_learning_map/

image.png

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.chi2,结合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

代码实例(浓缩的精华)

集合了

  • 数据构造
  • 数据划分
  • 特征选择
  • 模型融合
  • 交叉验证
  • 管道
  • 网格搜索
  • AUC、PR、混淆矩阵、学习曲线、验证曲线 ```python from sklearn.datasets import make_classification from sklearn.preprocessing import Normalizer,StandardScaler, MinMaxScaler, OneHotEncoder from sklearn.model_selection import train_test_split

from sklearn.feature_selection import VarianceThreshold, f_regression, chi2, SelectKBest, SelectFromModel from sklearn.decomposition import PCA from sklearn.compose import ColumnTransformer, make_column_transformer

from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier as RF from sklearn.ensemble import GradientBoostingClassifier as GBDT from sklearn.ensemble import StackingClassifier from sklearn.linear_model import LogisticRegression as LR

from sklearn.model_selection import validation_curve, learning_curve from sklearn.model_selection import KFold, cross_val_score, GridSearchCV from sklearn.pipeline import make_pipeline

from sklearn.metrics import f1_score, auc, precision_score, recall_score,accuracy_score from sklearn.metrics import plot_confusion_matrix, plot_precision_recall_curve,plot_roc_curve from server.until.dataprocess import draw

import numpy as np import matplotlib.pyplot as plt

X, y =make_classification(n_samples=10**3, n_features=20, n_classes=2, random_state=0) X_train, X_test, y_train, y_test = train_test_split(X, y , test_size=0.3) preprocess_pipe = make_pipeline( ColumnTransformer( [(“norm1”, Normalizer(norm=’l1’), [0, 1]), (“norm2”, Normalizer(norm=’l1’), slice(2, 10))] ) )

estimators = [ (‘rf’, RF(n_estimators=10, random_state=0)), (‘svc’, make_pipeline(StandardScaler(),SVC(random_state=0))), (‘gbdt’, make_pipeline(make_column_transformer((‘passthrough’, [1,2,3])), GBDT(n_estimators=50, random_state=0))) ]

clf = make_pipeline(preprocess_pipe, StackingClassifier(estimators=estimators, final_estimator=LR(), cv=5))

“”” 结合网格搜索: pipe = make_pipeline(preprocess_pipe, StackingClassifier(estimators=estimators, final_estimator=LR())) N_FEATURES_OPTIONS = [20, 40, 80] C_OPTIONS = [1, 10] param_grid = { ‘stackingclassifierrfn_estimators’:N_FEATURES_OPTIONS, ‘stackingclassifiersvcsvc__C’: C_OPTIONS }

grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)

grid.get_params().keys() # 注意:param_grid中的参数命名随着pipe加深而比较复杂,调用这个函数来确定正确的参数命名写法

cv_keys = (‘mean_test_score’, ‘std_test_score’, ‘params’)

for r, in enumerate(grid.cv_results[‘meantest_score’]): print(“%0.3f +/- %0.2f %r” % (grid.cv_results[cvkeys[0]][r], grid.cv_results[cvkeys[1]][r] / 2.0, grid.cv_results[cv_keys[2]][r]))

print(‘Best parameters: %s’ % grid.bestparams) print(‘Accuracy: %.2f’ % grid.bestscore) “””

clf.fit(X_train, y_train) accuracy_score(y_test, clf.predict(X_test))

for label,clf in estimators: clf_pipe = make_pipeline(preprocess_pipe, clf) scores = cross_val_score(clf_pipe, X, y, cv=3, scoring=’accuracy’) print(“Accuracy: %0.2f (+/- %0.2f) [%s]” % (scores.mean(), scores.std(), label))

plt.figure(figsize=(20, 5)) ax1 = plt.subplot(1,3,1) plot_roc_curve(clf, X_test, y_test, ax=ax1) # roc曲线 ax1 = plt.subplot(1,3,2) plot_precision_recall_curve(clf, X_test, y_test, ax=ax1) # PR曲线 ax1 = plt.subplot(1,3,3) plot_confusion_matrix(clf, X_test, y_test, ax=ax1) # 混淆矩阵

draw.plot_learning_curve(estimator=clf, title=”none”, X=X, y=y ) # 学习曲线

C_OPTIONS = list(range(10)) param={‘param_name’:’stackingclassifiersvcsvc__C’, ‘param_range’:C_OPTIONS} draw.plot_validation_curve(estimator=clf, X=X, y=y,param=param ) # 验证曲线 ```