目录
1. 分类变量处理:DictVectorizer 与 One-Hot Encoding
(2)One-Hot Encoding:独热编码(手动指定分类变量)
2. 文本数据处理:jieba 分词 + CountVectorizer
在机器学习项目中,数据决定了模型的上限,而算法只是不断逼近这个上限。很多初学者往往沉迷于复杂模型的调参,却忽视了数据处理与特征工程这两个核心环节。本文将结合实战代码,系统梳理从数据准备到特征优化的完整流程,帮你夯实机器学习的基础能力。
一、核心认知:数据处理与机器学习的互补关系
在预测类任务中,pandas 与机器学习算法是 “数据准备” 与 “核心算法” 的互补关系,二者缺一不可:
- 无 pandas:原始数据杂乱无章(如文本、分类变量、缺失值),机器学习算法无法直接使用,即 “无干净数据可用”;
- 无机器学习:pandas 处理后的结构化数据仅能用于统计分析,无法实现 “预测未来” 的核心目标。
完整的机器学习预测流程可总结为: 数据处理(pandas)
→ 特征工程
→ 模型选择与训练
→ 模型测试
→ 部署上线
其中,数据处理 + 特征工程直接决定了模型的最终效果,这也是工业界 “数据工程师比算法工程师更稀缺” 的核心原因。
二、基础概念:数据集、特征值与目标值
在开始实战前,必须明确三个核心概念,这是理解后续流程的前提:
概念 | 定义 | 示例 |
---|---|---|
特征值(Features) | 描述样本的属性,是模型的 “输入” | 头发长短、身高、体重、城市、温度 |
目标值(Target) | 模型需要预测的结果,是模型的 “输出” | 性别(男 / 女)、天气是否下雨(是 / 否) |
数据集(Dataset) | 特征值与目标值的集合(监督学习) | 包含 “身高、体重”(特征)和 “性别”(目标)的表格数据 |
1. 数据集的划分原则
为了评估模型泛化能力,需将数据集划分为训练集和测试集:
- 训练集:用于模型学习规律(占比 70%-80%);
- 测试集:用于验证模型在新数据上的表现(占比 20%-30%)。
划分逻辑:确保训练集与测试集的分布一致,避免因数据分布差异导致模型评估失真(如使用sklearn.model_selection.train_test_split
实现自动划分)。
2. 监督学习与无监督学习的核心区别
数据集的构成直接决定了学习类型:
- 监督学习:数据集包含 “特征值 + 目标值”(如根据 “身高体重” 预测 “性别”);
- 无监督学习:数据集仅包含 “特征值”(如根据用户消费记录进行聚类)。
三、实战环节 1:数据处理与特征工程核心技术
特征工程是将原始数据转化为 “模型可理解” 的数据的过程,核心目标是实现数据的值化(将文本、分类变量等非数值数据转为数值)。以下结合sklearn
与pandas
实战常用技术。
1. 分类变量处理:DictVectorizer 与 One-Hot Encoding
机器学习算法无法直接处理字符串类型的分类变量(如 “城市”“水果”),需通过编码转为数值。常用两种方式:
(1)DictVectorizer:字典类型数据编码
适用于输入数据为字典格式(键为特征名,值为特征值),自动将分类变量转为 one-hot 编码,数值变量保持不变
from sklearn.feature_extraction import DictVectorizer
def dict_vector_demo():
# 1. 准备字典类型数据
data = [
{"city": "北京", "temperature": 100, "weather": "晴"},
{"city": "上海", "temperature": 60, "weather": "阴"},
{"city": "深圳", "temperature": 30, "weather": "雨"},
]
# 2. 实例化编码器(默认sparse=True,返回稀疏矩阵;可设为False直接返回数组)
vectorizer = DictVectorizer(sparse=False)
# 3. 拟合并转换数据
result = vectorizer.fit_transform(data)
# 4. 查看编码后的特征名与结果
print("编码后的特征名:", vectorizer.get_feature_names_out())
print("编码结果:\n", result)
# 调用函数
dict_vector_demo()
输出结果:
编码后的特征名: ['city=北京' 'city=上海' 'city=深圳' 'temperature' 'weather=晴' 'weather=阴' 'weather=雨']
编码结果:
[[ 1. 0. 0. 100. 1. 0. 0.]
[ 0. 1. 0. 60. 0. 1. 0.]
[ 0. 0. 1. 30. 0. 0. 1.]]
核心作用:自动区分分类变量与数值变量,无需手动处理,适合结构化数据快速编码。
(2)One-Hot Encoding:独热编码(手动指定分类变量)
适用于明确知道分类变量列的场景(如pandas
DataFrame 中的某一列),更灵活可控。
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
def one_hot_demo():
# 1. 准备DataFrame数据
data = {"水果": ["苹果", "香蕉", "苹果", "香蕉", "橙子"]}
df = pd.DataFrame(data)
# 2. 实例化编码器(drop='first'可避免多重共线性,可选)
encoder = OneHotEncoder(sparse=False)
# 3. 拟合转换(需传入二维数组,故用df[["水果"]]而非df["水果"])
one_hot_result = encoder.fit_transform(df[["水果"]])
# 4. 查看结果
print("编码后的特征名:", encoder.get_feature_names_out())
print("独热编码结果:\n", one_hot_result)
# 调用函数
one_hot_demo()
输出结果:
编码后的特征名: ['水果_苹果' '水果_香蕉' '水果_橙子']
独热编码结果:
[[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
核心作用:将每个分类值转为一个二进制特征,避免分类变量的 “大小关系误解”(如将 “苹果 = 1,香蕉 = 2” 误解为香蕉 > 苹果)。
2. 文本数据处理:jieba 分词 + CountVectorizer
文本数据需先进行 “分词”(将句子拆分为词语),再通过 “词袋模型” 转为数值特征,核心工具是jieba
与sklearn.feature_extraction.text.CountVectorizer
。
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def text_feature_demo():
# 1. 准备中文文本
text1 = "人生道路坎坷多,但要懂得去生活!人生不但是以年月日计算的,事实往往是最好的日历。"
text2 = "学问是我们随身的财产,我们自己在什么地方,我们的学问也跟着我们在一起。"
# 2. 中文分词(jieba.cut返回生成器,需转为字符串)
def cut_text(text):
return " ".join(jieba.cut(text)) # 用空格连接分词结果
text1_cut = cut_text(text1)
text2_cut = cut_text(text2)
# 3. 实例化CountVectorizer(默认过滤停用词,如“的”“是”)
count_vec = CountVectorizer()
# 4. 拟合转换文本
text1_result = count_vec.fit_transform([text1_cut]) # 拟合+转换
text2_result = count_vec.transform([text2_cut]) # 仅转换(复用text1的词表)
# 5. 查看结果
print("词表(所有特征):", count_vec.get_feature_names_out())
print("text1词频矩阵:\n", text1_result.toarray())
print("text2词频矩阵:\n", text2_result.toarray())
# 调用函数
text_feature_demo()
输出结果(部分):
词表(所有特征): ['一起' '不但' '什么' '事实' '人生' '年月日' '地方' '财产' '往往' '最好' '日历' '懂得' '生活' '随身' '跟着' '道路' '计算' '学问' '自己']
text1词频矩阵:
[[0 1 0 1 2 1 0 0 1 1 1 1 1 0 0 1 1 0 0]]
text2词频矩阵:
[[1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 2 1]]
核心作用:实现中文文本的 “值化”,将词语转为特征,词频作为特征值,是文本分类、情感分析的基础。
3. 数据标准化与归一化:消除量纲影响
不同特征的量纲差异(如 “温度(0-100℃)” 与 “身高(150-200cm)”)会导致模型偏向数值大的特征,需通过缩放消除影响。常用两种方法:
(1)归一化(Min-Max Scaling)
将特征值缩放到[0,1]
区间,公式为: \(x_{scaled} = \frac{x - x_{min}}{x_{max} - x_{min}}\)
缺点:对异常值敏感(异常值会严重影响x_max
和x_min
)。
from sklearn.preprocessing import MinMaxScaler
def min_max_demo():
# 1. 准备数据(每行一个样本,每列一个特征)
data = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
# 2. 实例化归一化器
scaler = MinMaxScaler()
# 3. 拟合转换
scaled_data = scaler.fit_transform(data)
print("归一化结果:\n", scaled_data)
# 调用函数
min_max_demo()
输出结果:
归一化结果:
[[1. 0. 0. 0. ]
[0. 1. 1. 0.83333333]
[0.5 0.5 0.6 1. ]]
(2)标准化(Standard Scaling)
将特征值转为 “均值 = 0,标准差 = 1” 的正态分布,公式为: \(x_{scaled} = \frac{x - \mu}{\sigma}\)
优点:对异常值鲁棒(少量异常值对均值\(\mu\)和标准差\(\sigma\)影响小),是工业界更常用的方案。
from sklearn.preprocessing import StandardScaler
def standard_demo():
data = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print("标准化结果:\n", scaled_data)
# 调用函数
standard_demo()
输出结果:
标准化结果:
[[ 1.22474487 -1.22474487 -1.29777137 -1.46385011]
[-1.22474487 1.22474487 1.13554995 0.36596253]
[ 0. 0. 0.16222142 1.09788758]]
4. 数据降维:减少特征冗余
当特征数量过多时(如文本数据的词表维度),会导致 “维度灾难”(模型训练慢、泛化能力差),需通过降维减少特征数量。
(1)方差过滤(VarianceThreshold)
删除方差过小的特征(这类特征几乎无区分度,如 “所有样本的某列值均为 1”)。
from sklearn.feature_selection import VarianceThreshold
def variance_filter_demo():
# 1. 准备数据(第三列方差为0,应被过滤)
data = [[0, 2, 1, 3], [1, 0, 1, 4], [0, 2, 1, 3], [1, 0, 1, 5]]
# 2. 实例化过滤器(threshold=0.01:删除方差<0.01的特征)
var_filter = VarianceThreshold(threshold=0.01)
# 3. 过滤数据
filtered_data = var_filter.fit_transform(data)
print("过滤后方差>0.01的特征:\n", filtered_data)
# 调用函数
variance_filter_demo()
输出结果:
过滤后方差>0.01的特征:
[[0 2 3]
[1 0 4]
[0 2 3]
[1 0 5]]
(2)主成分分析(PCA)
通过线性变换将高维数据映射到低维空间,保留数据的主要信息(方差最大的方向)。
from sklearn.decomposition import PCA
def pca_demo():
# 1. 准备4维数据,降至2维
data = [[2, 1, 3, 4], [2, 2, 5, 6], [1, 2, 7, 8], [4, 2, 9, 10]]
# 2. 实例化PCA(n_components:目标维度,可设为小数表示保留的信息比例,如0.95)
pca = PCA(n_components=2)
# 3. 降维
pca_data = pca.fit_transform(data)
print("PCA降维后(4维→2维):\n", pca_data)
print("各主成分解释的方差比例:", pca.explained_variance_ratio_)
# 调用函数
pca_demo()
输出结果:
PCA降维后(4维→2维):
[[-3.45150522 -0.33072212]
[-1.15050174 0.33072212]
[ 1.15050174 0.33072212]
[ 3.45150522 -0.33072212]]
各主成分解释的方差比例: [0.96428571 0.03571429]
核心作用:在损失少量信息的前提下,大幅降低特征维度,提升模型训练效率。
四、核心概念:转换器与估计器
sklearn
库的核心设计模式是 “转换器(Transformer)” 与 “估计器(Estimator)”,理解二者区别是灵活使用sklearn
的关键。
1. 转换器(Transformer)
- 作用:对数据进行 “转换”(如编码、缩放、降维),输入数据→输出处理后的数据。
- 核心方法:
fit(X)
:学习数据的统计信息(如均值、方差、词表);transform(X)
:用fit
学到的规则转换数据;fit_transform(X)
:fit
+transform
的合并(更高效)。
- 常见示例:
MinMaxScaler
、CountVectorizer
、PCA
。
2. 估计器(Estimator)
- 作用:用于 “模型训练与预测”,是机器学习算法的封装(如分类、回归、聚类模型)。
- 核心方法:
fit(X, y)
:用训练集(X:特征,y:目标值)训练模型;predict(X)
:用训练好的模型预测测试集的目标值;score(X_test, y_test)
:用测试集评估模型性能(如准确率、R²)。
- 常见示例:
LogisticRegression
(逻辑回归)、RandomForestClassifier
(随机森林)、KMeans
(K 均值聚类)。
五、总结
机器学习的核心流程可概括为: 原始数据(杂乱)
→ pandas清洗(去重、补缺失值)
→ 转换器处理(编码、缩放)
→ 特征工程(降维、特征筛选)
→ 估计器训练(模型拟合)
→ 模型评估与部署
其中,数据处理与特征工程是决定模型效果的关键。建议初学者先熟练掌握本文中的编码、缩放、降维等基础技术,再逐步深入复杂模型的学习。
后续可进一步学习:
- pandas 数据清洗(缺失值、异常值处理);
- 特征筛选的高级方法(如相关性分析、递归特征消除);
- 估计器的调参技巧(网格搜索、随机搜索)。