ML工具(一) sklearn库备忘

本文最后更新于:2023年3月1日 上午

sklearn 全称 scikit-learn,是简单易行的机器学习工具。可处理以下任务板块:

1. 数据集

内置数据集

sklearn.datasets 内置部分数据集

拿取数据集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sklearn.datasets import load_iris
"""
return_X_y=True 因变量和自变量独立导出
"""

data = load_iris(return_X_y=False)
print(type(data))
# <class 'sklearn.utils.Bunch'>
print(data.keys())
# dict_keys(['data', 'target', 'target_names',
# 'images', 'DESCR'])
X = data.data
y = data.target

X, y = load_iris(return_X_y=True)
print(X.shape, y.shape, type(X))
# (150, 4) (150,) <class 'numpy.ndarray'>

2. 机器学习模型

基本概念

sklearn中用来训练数据的机器学习模型,是估计器 (estimator)

  • 创建模型

    1
    2
    from sklearn.linear_model import LinearRegression
    model = LinearRegression(normalize=True)
  • 调节超参数

    1
    2
    3
    4
    5
    6
    # 设置一组超参数
    normalize=True
    n_clusters=3
    # 访问超参数
    model.normalize
    model.n_clusters
  • 训练集拟合

    1
    2
    3
    4
    5
    6
    7
    # 有监督学习
    model.fit(X_train, y_train )
    # 无监督学习
    model.fit(X_train)
    # 访问 model 里学到的参数,比如线性回归里的特征前的系数 coef_,或 K 均值里聚类标签 labels_。
    model.coef_
    model.labels_

在估计器上延展出预测的功能,是预测器 (predictor)

1
2
3
4
5
6
7
8
9
10
11
12
model.predict(X_test):# 评估模型在新数据上的表现
model.predict(X_train):# 确认模型在老数据上的表现

# 对于分类问题,我们不仅想知道预测的类别是什么,有时还想知道预测该类别的信心如何。前者用 predict(),后者用 predict_proba()。
y_pred = model.predict( X_test )
p_pred = model.predict_proba( X_test )
print( y_test, '\n' )
print( y_pred, '\n' )
print( p_pred )
model.score( X_test, y_test ) # 分类问题中返回的是分类准确率
model.decision_function( X_test ) # 分类问题中返回的是每个样例在每个类下的分数值
# 不是每个预测器都有 predict_proba() 和 decision_function() 方法

sklearn中用来数据预处理的机器学习模型,是转换器 (transfor)

学习模型

回归

分类

预处理模型

数据变换

归一化

1
2
3
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit_transform(data)

标准化

1
2
3
from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler()
scaler.fit_transform(data)

特征组合

sklearn.preprocessing.PolynomialFeatures用来生成多项式特征,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sklearn.preprocessing import PolynomialFeatures
# degree: 最高次幂
# interaction_only: 默认为False, 指定为True时没有2次即高次幂项
# include_bias: 默认为True. 指定为True时包括0次幂项
# 返回类型为<numpy.ndarray>

'''创建拟合'''
pf = PolynomialFeatures(2)
pf.fit_transform(df2)
# (X1, X2) -> (1, X1, X2, X1^2, X1X2, X2^2)
pf = PolynomialFeatures(3)
pf.fit_transform(df2)
# (X1, X2) -> (1, X1, X2, X1^2, X1X2, X2^2, X1^3, X2^3, X1^2X2, X1X2^2)
pf = PolynomialFeatures(degree=3, interaction_only=True, include_bias=False)
pf.fit_transform(df3)
# (X1, X2, X3) -> (X1, X2, X1X2, X1X3, X2X3, X1X2X3)

'''属性查询'''
model.powers_ # 组合特征中单个特征的指数 <ndarray>

3. 模型验证

交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证重复地使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

  • 如果数据样本量小于一万条,我们采用交叉验证来训练优化选择模型
  • 如果样本大于一万条的话,我们一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。

简单交叉验证

随机的将样本数据分为训练集、测试集两部分 (train_test_split) ,训练集来训练模型,在测试集上验证模型及参数。

1
2
3
4
5
from sklearn.model_selection import train_test_split
# test_size: 测试集占比
# random_state: 随机数
# shuffle: 是否打乱数据
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.30,random_state=42)

K折交叉验证

K折交叉验证 (K-Folder Cross Validation) 会把样本数据随机的分成K份,每次随机的选择K-1份作为训练集,剩下的1份做测试集,重复K次。

1
2
3
4
5
6
7
8
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# n_splits: 划分为k折
# random_state: 随机数
# shuffle: 是否打乱数据
kf = KFold(n_splits=10) # 10折交叉验证

scores = cross_val_score(estimator=<估计器>,X,y,cv=kf,scoring=<评价指标>)

4. 评价指标

  • <estimator>score方法:<estimator>.score()
  • scoring参数:使用cross-validation的进行模型验证时,其函数内置scoring参数,见第一列
  • Metric函数:调用metrics模块函数,见第二列
scoring para meaning function
'accuracy' 分类,准确率 from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred)
'neg_mean_squared_error' 回归,MSEMSE的负值
from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred)
‘r2’ 回归,RR
from sklearn.metrics import r2_score
r2_score(y_true, y_pred)

5. 工作流

按顺序组合估计器 (estimator) / 预测器 (predictor) / 转换器 (transfor) 形成流水线,用以处理重复工作

1
2
3
4
5
6
7
8
9
10
11
12
13
'''创建'''
from sklearn.pipeline import Pipeline
from sklearn.pipeline import make_pipeline

pipe = Pipeline([
("<别名1>", <estimator1>),
("<别名2>", <estimator2>),
... ...
])
pipe = make_pipeline(<estimator1>, <estimator2>, ...)

'''查看各估计器详情'''
pipe.steps[1][1].coef_ # 取出索引为1的元组的估计器

网格搜索

自动调参的工具,常结合pipeline使用

1
from sklearn.model_selection import GridSearchCV

参考资料


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!