核心内容摘要
老旧设备优化与系统兼容性提升:开源工具OpenCore-Legacy-Patcher全攻略
核心比喻厨房烹饪流水线想象你是一个厨师要做一道菜比如炒菜。
原始食材数据不能直接下锅需要预处理生蔬菜原始数据 → 清洗StandardScaler → 切块OneHotEncoder → 调味添加特征 → 成品可用于炒菜的食材在机器学习中这个预处理流程就是transform
最简单的 transform 例子标准化场景把考试成绩从“
分”变成“平均0标准差1”的标准分import numpy as np from sklearn.preprocessing import StandardScaler # 原始成绩4个学生2门课 # 中文和数学成绩每门课满分不同 raw_scores np.array([ [85, 150], # 学生1语文85数学150 [60, 120], # 学生2语文60数学120 [95, 180], # 学生3语文95数学180 [70, 135] # 学生4语文70数学135 ]) print(原始成绩) print(raw_scores) print(f语文平均分: {raw_scores[:, 0].mean():.1f}, 数学平均分: {raw_scores[:, 1].mean():.1f})输出原始成绩 [[ 85 150] [ 60 120] [ 95 180] [ 70 135]] 语文平均分:
7
5, 数学平均分:
1
2问题两门课分数范围不一样比较不公平解决方案标准化StandardScaler# 创建转换器就像请一个专门的标准化工序师傅 scaler StandardScaler() # 步骤1先学习fit- 师傅看数据记住平均值和标准差 scaler.fit(raw_scores) # 师傅说我知道了语文平均
7
5标准差... # 步骤2再转换transform- 师傅开始工作 standard_scores scaler.transform(raw_scores) print(\n标准化后的成绩) print(standard_scores) print(f\n现在每门课平均分 {standard_scores.mean():.3f}) print(f每门课标准差 {standard_scores.std():.3f})输出标准化后的成绩 [[
47243196
22601794] [-
08761082 -
14981194] [
08761082
50758041] [-
47243196 -
58378641]] 现在每门课平均分
000 每门课标准差
1.
transform 的两步结构先学再做关键理解fit只看数据学习规则不改变数据transform应用规则转换数据fit_transform两步合并一步完成
常用 transform 示例大全示例1MinMaxScaler - 缩放到固定范围from sklearn.preprocessing import MinMaxScaler # 把成绩缩放到
范围常用于神经网络 scores np.array([85, 60, 95, 70]).reshape(-1,
# 需要二维 scaler MinMaxScaler() scaled scaler.fit_transform(scores) print(原始成绩:, scores.flatten()) print(缩放后
:, scaled.flatten()) print(f转换规则: 最小值{scaler.data_min_[0]}, 最大值{scaler.data_max_[0]})输出原始成绩: [85 60 95 70] 缩放后
: [
71428571
0.
1.
28571429] 转换规则: 最小值
6
0, 最大值
9
0示例2OneHotEncoder - 文字变数字from sklearn.preprocessing import OneHotEncoder # 学生的年级初
初
初三 grades np.array([[初一], [初三], [初二], [初一], [初三]]) encoder OneHotEncoder(sparse_outputFalse) encoded encoder.fit_transform(grades) print(原始年级:) print(grades.flatten()) print(\n独热编码后每个年级一列1表示是0表示不是:) print(encoded) print(f\n编码器记住的类别: {encoder.categories_})输出text原始年级: [初一 初三 初二 初一 初三] 独热编码后每个年级一列1表示是0表示不是: [[
1.
0.
] [
0.
0.
] [
0.
1.
] [
1.
0.
] [
0.
0.
]] 编码器记住的类别: [array([初一, 初二, 初三], dtypeobject)]示例3SimpleImputer - 填充缺失值from sklearn.impute import SimpleImputer # 有缺失的成绩表NaN表示缺考 scores_with_missing np.array([ [85, 90], [np.nan, 75], # 语文缺考 [92, np.nan], # 数学缺考 [70, 85] ]) print(原始数据有缺失:) print(scores_with_missing) imputer SimpleImputer(strategymean) # 用平均值填充 filled imputer.fit_transform(scores_with_missing) print(\n填充后用平均值填充NaN:) print(filled) print(f\n填充的值: 语文{imputer.statistics_[0]:.1f}, 数学{imputer.statistics_[1]:.1f})输出原始数据有缺失: [[
85.
] [nan
] [
nan] [
70.
]] 填充后用平均值填充NaN: [[
85.
] [
8
33
] [
92.
8
33] [
70.
]] 填充的值: 语文
8
33, 数学
83.
完整的 transform 流水线Pipelinefrom sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer # 模拟学生数据 student_data np.array([ # 语文分, 数学分, 年级 [85, 150, 初一], [60, 120, 初三], [95, 180, 初二], [70, 135, 初一] ]) # 拆分成特征 X_numeric student_data[:, :2].astype(float) # 前两列是数值 X_categorical student_data[:, 2].reshape(-1,
# 第三列是文字 print(原始数据:) print(student_data) # 创建转换管道 numeric_transformer Pipeline(steps[ (scaler, StandardScaler()) # 数值标准化 ]) categorical_transformer Pipeline(steps[ (onehot, OneHotEncoder()) # 文字编码 ]) # 组合转换器 preprocessor ColumnTransformer( transformers[ (num, numeric_transformer, [0, 1]), # 列
用数值转换 (cat, categorical_transformer, [2]) # 列2用分类转换 ] ) # 一步完成学习规则 转换 transformed preprocessor.fit_transform(student_data) print(\n转换后的数据:) print(transformed) print(f\n形状: {transformed.shape}) print(说明: 前2列是标准化成绩后3列是年级的独热编码)
transform 在 PyTorch 中的样子import torch import torch.nn as nn # PyTorch 也有 transform通常通过 nn.Module 实现 class SimpleNormalizer(nn.Module): 自定义标准化转换器 def __init__(self): super().__init__() self.mean None self.std None def fit(self, X): 学习规则 self.mean X.mean(dim
self.std X.std(dim
return self def transform(self, X): 应用转换 return (X - self.mean) / self.std def forward(self, X): PyTorch风格 return self.transform(X) # 使用示例 X_tensor torch.tensor([[
8
0,
1
0], [
6
0,
1
0], [
9
0,
1
0], [
7
0,
1