当前位置: 首页 > 工具软件 > pipelines > 使用案例 >

Kaggle学习笔记--Pipelines

公良英资
2023-12-01


kaggle课程连接 https://www.kaggle.com/alexisbcook/pipelines.

简介

sklearn.pipeline()处理机制:

Pipeline()的作用就是把所有模型塞到管道里,调用管道时依次对数据进行处理,得到最终的分类结果。使用管道的有点有:
1.更干净的代码:在预处理的每个步骤中考虑数据可能会变得混乱。
2.使用管道,您无需在每个步骤中手动跟踪培训和验证数据。
3.错误更少:错误地使用步骤或忘记预处理步骤的机会更少。
4.易于实现生产:很难将模型从原型过渡到可大规模部署的模型。

通常会按照以下顺序来构建管道:【数据标准化的学习器—特征提取的学习器—执行预测的学习器/分类器】其中最后一个模型一定要是估计器,例如分类器。
Pipeline就是把这几个模型塞到管子里合并成一个模型调用,当训练样本数据送进Pipeline进行处理时, 它会逐个调用每个模型的fit()和transform()方法,其中最后一个节点的fit()方法来拟合数据。
————————————————
原文链接:Python学习笔记外传之sklearn中的Pipeline串联用法(一)https://blog.csdn.net/u010230273/article/details/98493025.

#模型串联
pip=Pipeline(
[ #所有模型写进列表内
(‘模型一名称’,模型一调用), #模型名称可以自己命名
(‘模型二名称’,模型二调用),
(‘模型三名称’, 模型三调用)
]
)
#模型调用
model=pip.fit(x,y)

综上所诉,pipeline()的作用就是封装打包各个模块,下面简单介绍一下本文所设计的pipeline结构:

- clf(Pipeline)[
   preprocessor(ColumnTransformer)[
    numerical_transformer[
        SimpleImputer],
    categorical_transformer(Pipeline)[
        SimpleImputer,
        OneHotEncoder]],
model[RandomForestRegressor]
]

数据准备

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the data
X_full = pd.read_csv('C:/Users/Administrator/Desktop/home-data-for-ml-course/train.csv', index_col='Id')
X_test_full = pd.read_csv('C:/Users/Administrator/Desktop/home-data-for-ml-course/test.csv', index_col='Id')

# Remove rows with missing target, separate target from predictors
X_full.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = X_full.SalePrice
X_full.drop(['SalePrice'], axis=1, inplace=True)

# Break off validation set from training data
X_train_full, X_valid_full, y_train, y_valid = train_test_split(X_full, y,
                                                                train_size=0.8, test_size=0.2,
                                                                random_state=0)

# "Cardinality" means the number of unique values in a column
# Select categorical columns with relatively low cardinality (convenient but arbitrary)
categorical_cols = [cname for cname in X_train_full.columns if
                    X_train_full[cname].nunique() < 10 and
                    X_train_full[cname].dtype == "object"]

# Select numerical columns
numerical_cols = [cname for cname in X_train_full.columns if
                X_train_full[cname].dtype in ['int64', 'float64']]

# Keep selected columns only
my_cols = categorical_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()
X_test = X_test_full[my_cols].copy()

步骤1:定义预处理步骤

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# 数值数据的预处理SimpleImputer用于缺失值补全,constant用常量补全
#定义数值型特征预处理器
numerical_transformer = SimpleImputer(strategy='constant')

# 预处理分类数据
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),#most_frequent频次最多的
    ('onehot', OneHotEncoder(handle_unknown='ignore'))#ignore表示当validation data中出现training data中没出现的值时,忽略。
])

# 捆绑预处理数字和分类数据
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_cols),
        ('cat', categorical_transformer, categorical_cols)
    ])

# 定义模型--随机森林
model = RandomForestRegressor(n_estimators=100, random_state=0)

首先介绍一下本文用来处理缺失值的SimpleImputer类。

SimpleImputer类处理缺失值

SimpleImputer类提供了处理输入缺失值的基本策略。缺失值可以用常量值或使用缺失值所在列的统计信息(平均值、中位数或最频繁)进行填充。当使用’most_frequent’或’constant’策略时,SimpleImputer类还支持表示为字符串值或pandas分类的分类数据。
以下代码演示如何使用包含缺少值的列(轴0)的平均值替换缺少值。

import numpy as np
from sklearn.impute import SimpleImputer
 
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
x = [[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]
data = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
 
Fit = imp_mean.fit(x)
print(Fit)

SimpleImputer(copy=True,fill_value=None,missing_values=nan,strategy=‘mean’,verbose=0)

查看用来填补每列的值使用:Fit.statistics_

Fit.statistics_

[7. 3.5 6.]

计算过程【(7+4+10)/3=7】【(2+5)/2=3.5】【(3+6+9)/3=6】
【注】mean是每列非‘nan’的数值的均值,如某列为[2,np.nan,np.nan]则mean为2/1=2

new_data = imp_mean.transform(data)
print(imp_mean.transform(data))

[[7. 2. 3.]
[4. 3.5 6.]
[10. 3.5 9.]]

SimpleImputer用法来源:https://blog.csdn.net/qq_40773512/article/details/82662191.

ColumnTransformer捆绑预处理步骤

与管道将预处理和建模步骤捆绑在一起的方式类似,本文使用ColumnTransformer类将不同的预处理步骤捆绑在一起,如在数字数据中估算缺失值,以及插补缺失值,并对分类数据应用一键编码。
sklearn文档ColumnTransformer简介:https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html?highlight=columntransformer.

from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_cols),
        ('cat', categorical_transformer, categorical_cols)
    ])

transformers:(名称,转换器,列)元组的列表,指定要应用于数据子集的转换器对象。

步骤3:创建和评估管道

最后,我们使用Pipeline类来定义捆绑了预处理和建模步骤的管道。
通过管道,我们可以预处理训练数据并将模型拟合到一行代码中。

# 在管道中捆绑预处理和建模代码
clf = Pipeline(steps=[('preprocessor', preprocessor),
                      ('model', model)
                     ])

接下来就是常规操作了,通过管道,我们将X_valid中未处理的特征提供给predict()命令,并且管道在生成预测之前自动对特征进行预处理。

# 预处理训练数据,拟合模型
clf.fit(X_train, y_train)

#预处理验证数据,获得预测
preds = clf.predict(X_valid)

print('MAE:', mean_absolute_error(y_valid, preds))

MAE: 17861.780102739725

# 预处理测试数据,拟合模型
preds_test =clf.predict(X_test)
# 保存至文件
output = pd.DataFrame({'Id': X_test.index,
                       'SalePrice': preds_test})
output.to_csv('.../submission_datawork5.csv', index=False)
 类似资料: