5.12 打卡

知识回顾:

  1. 转化器和估计器的概念
  2. 管道工程
  3. ColumnTransformer和Pipeline类

5.12 打卡_第1张图片

转换器(transformer)

转换器(transformer)是一个用于对数据进行预处理和特征提取的 estimator,它实现一个 transform 方法,用于对数据进行预处理和特征提取。转换器通常用于对数据进行预处理,例如对数据进行归一化、标准化、缺失值填充等。转换器也可以用于对数据进行特征提取,例如对数据进行特征选择、特征组合等。转换器的特点是无状态的,即它们不会存储任何关于数据的状态信息(指的是不存储内参)。转换器仅根据输入数据学习转换规则(比如函数规律、外参),并将其应用于新的数据。因此,转换器可以在训练集上学习转换规则,并在训练集之外的新数据上应用这些规则。

常见的转换器包括数据缩放器(如StandardScaler、MinMaxScaler)、特征选择器(如SelectKBest、PCA)、特征提取器(如CountVectorizer、TF-IDFVectorizer)等。

之前我们都是说对xxxx类进行实例化,现在可以换一个更加准确的说法,如下:

# 导入StandardScaler转换器

from sklearn.preprocessing import StandardScaler

# 初始化转换器

scaler = StandardScaler()

# 1. 学习训练数据的缩放规则(计算均值和标准差),本身不存储数据

scaler.fit(X_train)

# 2. 应用规则到训练数据和测试数据

X_train_scaled = scaler.transform(X_train)

X_test_scaled = scaler.transform(X_test)

# 也可以使用fit_transform一步完成

# X_train_scaled = scaler.fit_transform(X_train)

估计器(estimator)

估计器(Estimator)是实现机器学习算法的对象或类。它用于拟合(fit)数据并进行预测(predict)。估计器是机器学习模型的基本组成部分,用于从数据中学习模式、进行预测和进行模型评估。

估计器的主要方法是fit和predict。fit方法用于根据输入数据学习模型的参数和规律,而predict方法用于对新的未标记样本进行预测。估计器的特点是有状态的,即它们在训练过程中存储了关于数据的状态信息,以便在预测阶段使用。估计器通过学习训练数据中的模式和规律来进行预测。因此,估计器需要在训练集上进行训练,并使用训练得到的模型参数对新数据进行预测。

常见的估计器包括分类器(classifier)、回归器(regresser)、聚类器(clusterer)。

from sklearn.linear_model import LinearRegression

# 创建一个回归器

model = LinearRegression()

# 在训练集上训练模型

model.fit(X_train_scaled, y_train)

# 对测试集进行预测

y_pred = model.predict(X_test_scaled)

管道(pipeline)

了解了分类器和估计器,所以可以理解为在机器学习是由转换器(Transformer)和估计器(Estimator)按照一定顺序组合在一起的来完成了整个流程。

机器学习的管道(Pipeline)机制通过将多个转换器和估计器按顺序连接在一起,可以构建一个完整的数据处理和模型训练流程。在管道机制中,可以使用Pipeline类来组织和连接不同的转换器和估计器。Pipeline类提供了一种简单的方式来定义和管理机器学习任务的流程。

管道机制是按照封装顺序依次执行的一种机制,在机器学习算法中得以应用的根源在于,参数集在新数据集(比如测试集)上的重复使用。且代码看上去更加简洁明确。这也意味着,很多个不同的数据集,只要处理成管道的输入形式,后续的代码就可以复用。(这里为我们未来的python文件拆分做铺垫),也就是把很多个类和函数操作写进一个新的pipeline中。

这符合编程中的一个非常经典的思想:don't repeat yourself。(dry原则),也叫做封装思想,我们之前提到过类似的思想的应用: 函数、类,现在我们来说管道。

Pipeline最大的价值和核心应用场景之一,就是与交叉验证和网格搜索等结合使用,来:

1. 防止数据泄露: 这是在使用交叉验证时,Pipeline自动完成预处理并在每个折叠内独立fit/transform的关键优势。

2. 简化超参数调优: 可以方便地同时调优预处理步骤和模型的参数。

作业:

整理下全部逻辑的先后顺序,看看能不能制作出适合所有机器学习的通用pipeline

  1. 数据加载:从各种来源(CSV、数据库、API 等)加载原始数据。
  2. 数据划分:将数据集划分为训练集、验证集(可选)和测试集。
  3. 特征工程和预处理 (ColumnTransformer 的核心):

3.1 缺失值处理:

①识别缺失值。

②使用适当的方法填充缺失值(例如,均值、中位数、众数、常数值、模型预测)。

3.2 特征缩放/标准化:

将数值特征缩放到相似的范围(例如,标准化、最小-最大缩放、RobustScaler)。

3.3 特征编码:

将类别特征转换为数值表示(例如,独热编码、标签编码、有序编码、目标编码)。

3.4 特征转换:

①应用数学变换(例如,对数变换、幂变换)以改善特征分布。

②创建新的特征(例如,多项式特征、交互特征)。

3.5 特征选择/降维:

①选择最相关的特征(例如,基于方差、相关性、模型特征重要性)。

②降低特征维度(例如,PCA、t-SNE)。

3.6 异常值处理:

①识别异常值。

②处理异常值(例如,删除、替换、转换)。

4. 模型选择:

根据问题类型(分类、回归、聚类等)选择合适的机器学习模型。

考虑模型的复杂性、可解释性和性能。

5. 模型训练:

使用训练数据拟合选定的模型。

6. 模型评估:

使用验证集(如果存在)或交叉验证评估模型的性能。

使用适当的评估指标(例如,准确率、精确率、召回率、F1 值、AUC、RMSE、R 平方)。

7. 超参数调优:

使用网格搜索、随机搜索或贝叶斯优化等方法调整模型的超参数,以获得最佳性能。

8. 模型部署:

将训练好的模型部署到生产环境,用于预测新数据。

9. 模型监控和维护:

监控模型的性能,并定期重新训练模型,以适应数据的变化。

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import train_test_split

# 1. 载入数据
data = pd.read_csv('your_data.csv')

# 2. 目标变量和特征
target_col = 'target'  # 你需要定义你的目标变量列名
X = data.drop([target_col], axis=1)
y = data[target_col]

# 3. 数据集划分(在任何预处理前)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

# 4. 特征类型识别(手动定义或自动检测)
# 根据你的数据设置
object_cols = X.select_dtypes(include=['object']).columns.tolist()

# 定义有序类别特征及其类别顺序(如果有)
ordinal_features = ['list', 'of', 'ordered', 'features']
ordinal_categories = [
    # 对应每个特征的类别顺序
    ['category1', 'category2', 'category3'],  # feature1
    # ...
]

# 无序类别特征
nominal_features = ['list', 'of', 'nominal', 'features']

# 数值型特征(自动推断或者提前定义)
numerical_features = list(set(X.columns) - set(object_cols))

# 5. 构建不同预处理方案
# 有序类别特征处理
ordinal_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('encoder', OrdinalEncoder(categories=ordinal_categories, handle_unknown='use_encoded_value', unknown_value=-1))
])

# 无序类别特征处理
nominal_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore', sparse=False))
])

# 数值特征处理
numerical_transformer = Pipeline([
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('scaler', StandardScaler())
])

# 6. 构建 ColumnTransformer
preprocessor = ColumnTransformer(
    transformers=[
        ('ord', ordinal_transformer, ordinal_features),
        ('nom', nominal_transformer, nominal_features),
        ('num', numerical_transformer, numerical_features)
    ],
    remainder='drop'  # 或'passthrough',视情况而定
)

# 7. 构建完整Pipeline(预处理+模型)
model = Pipeline([
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(random_state=42))
])

# 8. 训练模型
model.fit(X_train, y_train)

# 9. 预测
predictions = model.predict(X_test)

# 10. 评估
print("分类报告:")
print(classification_report(y_test, predictions))
print("混淆矩阵:")
print(confusion_matrix(y_test, predictions))

你可能感兴趣的:(深度学习,人工智能)