机器学习(一)——sklearn中的pipeline

当对训练集应用各种预处理操作时(比如特征标准化、主成分分析等等),都需要对测试集重复利用这些参数,以免出现数据泄露(data leakage)。

pipeline 实现了对全部步骤的流式化封装和管理(streaming workflows with pipelines),可以很方便地使参数集在新数据集(比如测试集)上被重复使用。

Pipeline可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。Pipeline的主要用途:

1.便捷性和封装性 只要对数据调用fitpredict 一次来适配所有的一系列评估器,对算法模型进行训练和预测。

2.联合的参数选择 可以结合grid search选择管道中所有评估器的参数。

3.安全性 训练转换器和预测器使用的是相同样本,管道有助于防止来自测试数据的统计数据泄露到交叉验证的训练模型中.

管道中的所有评估器,除了最后一个评估器,管道的所有评估器必须是转换器。 (例如,必须有transform方法). 最后一个评估器的类型不限(转换器、分类器等等)

Pipeline是使用 (key,value) 对的列表构建的,其中key是步骤名称的字符串,而value是一个估计器对象

示例:
1.数据准备

import pandas as pd
from sklearn.model_selection import train_test_split

# 数据读取
data = pd.read_excel('data.xlsx')

# 切分目标值和训练数据
y = data.Price
X = data.drop(['Price'], axis=1)

# 切分训练集验证集
X_train_full, X_test_full, y_train, y_test = train_test_split(X, y, train_size=0.7, test_size=0.3,random_state=0)

# 分类型变量
categorical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique() < 10 and 
                        X_train_full[cname].dtype == "object"]

# 数值型变量
numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]

my_cols = categorical_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_test = X_test_full[my_cols].copy()

2.创建pipeline

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder

# SimpleImputer处理缺失值
# strategy:空值填充的策略:mean、median、most_frequent、constant。
#mean表示该列的缺失值由该列的均值填充。median为中位数,most_frequent为众数。
#constant表示将空值填充为自定义的值,但这个自定义的值要通过fill_value来定义。
numerical_transformer = SimpleImputer(strategy='constant')

#这里使用pipeline将两个处理过程打包。
# OneHotEncoder:将每个分类特征转换成0-1数值型编码
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# 将数值和分类数据的预处理打包起来
#ColumnTransformer()可以选择地进行数据转换。
#使用时必须指定一个转换器列表。每个转换器是一个三元素元组,用于定义转换器的名称,要应用的转换以及要应用于其的列索引。
# 例如:(名称,对象,列)
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_cols),
        ('cat', categorical_transformer, categorical_cols)
    ])

#定义模型
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=100, random_state=0)

#创建管道pipeline
from sklearn.metrics import mean_absolute_error

#打包数据预处理和建模代码
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                              ('model', model)])
# 对训练数据进行预处理和建模
my_pipeline.fit(X_train, y_train)

# 对验证集数据进行预处理和建模
predict = my_pipeline.predict(X_test)
#输出验证集模型预测结果
predict_arr = predict.toarray()

# 模型评估
score = mean_absolute_error(y_test, preds)
print('MAE:', score)

# 查看整个pipeline 
my_pipeline.steps

#查看第一步的全部内容
my_pipeline.steps[0]

#查看第一步的处理过程
my_pipeline[0]


PS.分类模型评价

#准确率、平均精度均值(查准率、召回率、F1)、汉明损失harming loss
#详见:https://blog.csdn.net/fivemillion/article/details/125223758?spm=1001.2014.3001.5501
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y_test,predict)  #准确率,返回正确分类的比例,TP+TN(所有预测正确的正例及反例
from sklearn.metrics import hamming_loss
r1 = hamming_loss(y_test, predict)  #汉明损失,衡量标签被错分的次数
from sklearn.metrics import average_precision_score
r2 = average_precision_score(y_test, predict_arr)  #平均精度均值 mPA
from sklearn.metrics import precision_score, recall_score, f1_score
p = precision_score(y_test, predict_arr, average='binary') #查准率,预测出的正例正确的比例
r = recall_score((y_test, predict_arr, average='binary') #召回率,正例被成功预测的比例
f1score = f1_score(true, pred, average='binary') #F1值,2(PR)/(P+R)

#average=binary情况下要求输入中的y_true和y_pred都是二值的(仅包含01)
#average=micro情况,就是计算以各类作为Positve时的预测正确TP的和再除以以各类作为Positve时的TP+FP,(sum(TP for Positive as 0,1,2...)/sum((TP+FP) for Positive as 0,1,2...))
#average=macro情况,与average=micro情况相对立,是先分别计算将各类视作Positive情况下的score,再求个平均,即average(TP/(TP+FP) for Positive as 0,1,2...)

3.Pipeline可以结合GridSearch来对参数进行选择

from sklearn.datasets import fetch_20newsgroups
import numpy as np
news = fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X_count_train = vec.fit_transform(X_train)
X_count_test = vec.transform(X_test)
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
#使用pipeline简化系统搭建流程,将文本抽取与分类器模型串联起来
clf = Pipeline([
    ('vect',TfidfVectorizer(stop_words='english')),('svc',SVC())
])

parameters = {
    'svc__gamma':np.logspace(-2,1,4),
    'svc__C':np.logspace(-1,1,3),
    'vect__analyzer':['word']
}

#n_jobs=-1代表使用计算机的全部CPU
from sklearn.grid_search import GridSearchCV
gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)

%time _=gs.fit(X_train,y_train)
print (gs.best_params_,gs.best_score_)
print (gs.score(X_test,y_test))

参考文献:
sklearn中文文档:​https://sklearn.apachecn.org​
https://blog.csdn.net/WHYbeHERE/article/details/125074001?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-125074001-blog-106208747.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-125074001-blog-106208747.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=5

你可能感兴趣的:(机器学习,机器学习,sklearn,python)