机器学习入门核心:从数据处理到特征工程

目录

一、核心认知:数据处理与机器学习的互补关系

二、基础概念:数据集、特征值与目标值

1. 数据集的划分原则

2. 监督学习与无监督学习的核心区别

三、实战环节 1:数据处理与特征工程核心技术

1. 分类变量处理:DictVectorizer 与 One-Hot Encoding

(1)DictVectorizer:字典类型数据编码

(2)One-Hot Encoding:独热编码(手动指定分类变量)

2. 文本数据处理:jieba 分词 + CountVectorizer

3. 数据标准化与归一化:消除量纲影响

(1)归一化(Min-Max Scaling)

(2)标准化(Standard Scaling)

4. 数据降维:减少特征冗余

(1)方差过滤(VarianceThreshold)

(2)主成分分析(PCA)

四、核心概念:转换器与估计器

1. 转换器(Transformer)

2. 估计器(Estimator)

五、总结


在机器学习项目中,数据决定了模型的上限,而算法只是不断逼近这个上限。很多初学者往往沉迷于复杂模型的调参,却忽视了数据处理与特征工程这两个核心环节。本文将结合实战代码,系统梳理从数据准备到特征优化的完整流程,帮你夯实机器学习的基础能力。

一、核心认知:数据处理与机器学习的互补关系

在预测类任务中,pandas 与机器学习算法是 “数据准备” 与 “核心算法” 的互补关系,二者缺一不可:

  • 无 pandas:原始数据杂乱无章(如文本、分类变量、缺失值),机器学习算法无法直接使用,即 “无干净数据可用”;
  • 无机器学习:pandas 处理后的结构化数据仅能用于统计分析,无法实现 “预测未来” 的核心目标。

完整的机器学习预测流程可总结为: 数据处理(pandas) → 特征工程 → 模型选择与训练 → 模型测试 → 部署上线

其中,数据处理 + 特征工程直接决定了模型的最终效果,这也是工业界 “数据工程师比算法工程师更稀缺” 的核心原因。

二、基础概念:数据集、特征值与目标值

在开始实战前,必须明确三个核心概念,这是理解后续流程的前提:

概念定义示例
特征值(Features)描述样本的属性,是模型的 “输入”头发长短、身高、体重、城市、温度
目标值(Target)模型需要预测的结果,是模型的 “输出”性别(男 / 女)、天气是否下雨(是 / 否)
数据集(Dataset)特征值与目标值的集合(监督学习)包含 “身高、体重”(特征)和 “性别”(目标)的表格数据

1. 数据集的划分原则

为了评估模型泛化能力,需将数据集划分为训练集测试集

  • 训练集:用于模型学习规律(占比 70%-80%);
  • 测试集:用于验证模型在新数据上的表现(占比 20%-30%)。

划分逻辑:确保训练集与测试集的分布一致,避免因数据分布差异导致模型评估失真(如使用sklearn.model_selection.train_test_split实现自动划分)。

2. 监督学习与无监督学习的核心区别

数据集的构成直接决定了学习类型:

  • 监督学习:数据集包含 “特征值 + 目标值”(如根据 “身高体重” 预测 “性别”);
  • 无监督学习:数据集仅包含 “特征值”(如根据用户消费记录进行聚类)。

三、实战环节 1:数据处理与特征工程核心技术

特征工程是将原始数据转化为 “模型可理解” 的数据的过程,核心目标是实现数据的值化(将文本、分类变量等非数值数据转为数值)。以下结合sklearnpandas实战常用技术。

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:独热编码(手动指定分类变量)

适用于明确知道分类变量列的场景(如pandasDataFrame 中的某一列),更灵活可控。

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

文本数据需先进行 “分词”(将句子拆分为词语),再通过 “词袋模型” 转为数值特征,核心工具是jiebasklearn.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_maxx_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的合并(更高效)。
  • 常见示例MinMaxScalerCountVectorizerPCA

2. 估计器(Estimator)

  • 作用:用于 “模型训练与预测”,是机器学习算法的封装(如分类、回归、聚类模型)。
  • 核心方法
    • fit(X, y):用训练集(X:特征,y:目标值)训练模型;
    • predict(X):用训练好的模型预测测试集的目标值;
    • score(X_test, y_test):用测试集评估模型性能(如准确率、R²)。
  • 常见示例LogisticRegression(逻辑回归)、RandomForestClassifier(随机森林)、KMeans(K 均值聚类)。

五、总结

机器学习的核心流程可概括为: 原始数据(杂乱) → pandas清洗(去重、补缺失值) → 转换器处理(编码、缩放) → 特征工程(降维、特征筛选) → 估计器训练(模型拟合) → 模型评估与部署

其中,数据处理与特征工程是决定模型效果的关键。建议初学者先熟练掌握本文中的编码、缩放、降维等基础技术,再逐步深入复杂模型的学习。

后续可进一步学习:

  1. pandas 数据清洗(缺失值、异常值处理);
  2. 特征筛选的高级方法(如相关性分析、递归特征消除);
  3. 估计器的调参技巧(网格搜索、随机搜索)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值