机器学习入门实战 2 - 数据预处理
本文使用的是 train.csv,请下载后将其重命名为 house-prices.csv 方便代码使用。下载本文使用的 house-prices.csv 数据集。,会影响后续机器学习模型的效果。在开始处理数据之前,我们需要。房价数据中,不同的特征有。因此,我们的第一步是。:删除(如果影响不大)(适用于有顺序的类别)(适用于无顺序的类别)(中位数、None)
🚀 目标:让你一步步实践,掌握数据清洗和预处理,让数据适用于机器学习模型训练!
📖 本次任务,你将学到:
- 如何加载数据并检查数据质量
- 如何处理缺失值(填充/删除),避免数据影响模型训练
- 如何转换类别变量(Label Encoding & One-Hot Encoding),让模型理解文本数据
- 如何进行数据标准化 & 归一化,使数据更容易被模型学习
- 如何保存清洗后的数据,方便后续使用
📌 1. 获取数据
🔹 为什么要检查数据?
在开始处理数据之前,我们需要 了解数据的基本情况。
如果数据缺失严重、不均衡、格式错误,会影响后续机器学习模型的效果。
因此,我们的第一步是 读取数据并查看数据结构。
💻 代码示例:加载数据
📌 步骤:
- 先确保你已下载
house-prices.csv数据文件,并放在 Python 代码目录下。
可以从Kaggle下载本文使用的 house-prices.csv 数据集。
本文使用的是 train.csv,请下载后将其重命名为 house-prices.csv 方便代码使用。
- 运行以下代码,加载并检查数据:
import pandas as pd
# 读取数据
df = pd.read_csv("house-prices.csv")
# 查看数据前 5 行
print(df.head())
# 查看数据基本信息(列名、数据类型、缺失值)
print(df.info())
# 统计每列缺失值情况
missing_values = df.isnull().sum()
# 计算缺失值占比
missing_percentage = (missing_values / len(df)) * 100
# 按缺失比例排序
missing_data = pd.DataFrame({"Missing Count": missing_values, "Missing Percentage": missing_percentage})
missing_data = missing_data.sort_values(by="Missing Percentage", ascending=False)
# 显示前 20 行(缺失值最多的列)
print(missing_data.head(20))
✅ 输出示例:
Missing Count Missing Percentage
PoolQC 1453 99.520548
MiscFeature 1406 96.301370
Alley 1369 93.767123
Fence 1179 80.753425
MasVnrType 872 59.726027
FireplaceQu 690 47.260274
LotFrontage 259 17.739726
GarageQual 81 5.547945
GarageFinish 81 5.547945
GarageType 81 5.547945
...
📌 分析结果:
Alley,PoolQC,MiscFeature,Fence等列的缺失值超过 80%,这些可能需要删除。LotFrontage,FireplaceQu缺失值较少,可以用适当方法填充。
📌 2. 处理缺失值
🔹 为什么要处理缺失值?
在机器学习中,缺失值可能会导致:
- 无法训练模型(有些算法不支持缺失值)
- 影响预测准确性(模型在训练时学不到完整信息)
处理方法:
✅ 缺失值过多的列:删除(如果影响不大)
✅ 数值型数据缺失:用中位数或均值填充
✅ 类别型数据缺失:用 “None” 或最常见值填充
💻 代码示例:删除缺失值过多的列
📌 如果一个列的缺失值超过 80%,我们可以直接删除它
# 计算每列缺失比例
missing_ratio = df.isnull().sum() / len(df)
# 删除缺失值超过 80% 的列
df = df.drop(columns=missing_ratio[missing_ratio > 0.8].index)
# 再次检查数据,确保删除成功
print(df.isnull().sum().sort_values(ascending=False))
✅ 删除了 PoolQC、MiscFeature、Fence,因为它们的缺失值太多,信息不足
💻 代码示例:填充缺失值
填充数值型变量(用中位数填充)
📌 为什么选择中位数?
- 如果数据分布不均匀(如房价有极端值),中位数比均值更稳定。
✅ 这样可以避免极端值影响填充值。
填充类别变量(用 “None” 填充)
📌 为什么填充 “None”?
- 某些类别数据(如
GarageType)如果缺失,可能表示 “没有车库” ,所以填充"None"更合理。
# 填充数值列(用中位数)
df.fillna(df.select_dtypes(include=["number"]).median(), inplace=True)
# 填充类别列(用最常见值)
for col in df.select_dtypes(include=["object"]).columns:
df[col].fillna(df[col].mode()[0], inplace=True)
📌 再次检查缺失值
print(df.isnull().sum().sum()) # 确保所有缺失值已处理
✅ 如果输出 0,说明缺失值已经全部填充!
📌 3. 处理类别变量
🔹 为什么要转换类别变量?
机器学习无法直接理解文本数据,必须转换为 数值格式。
两种常见的方法:
✅ Label Encoding(适用于有顺序的类别)
✅ One-Hot Encoding(适用于无顺序的类别)
💻 代码示例:Label Encoding
📌 适用于有大小顺序的类别,例如 ExterQual(房屋质量):
Ex = Excellent
Gd = Good
TA = Average
Fa = Fair
Po = Poor
from sklearn.preprocessing import LabelEncoder
print(df[["ExterQual"]].head()) # 查看转换前的数据
label_encoder = LabelEncoder()
df["ExterQual"] = label_encoder.fit_transform(df["ExterQual"])
print(df[["ExterQual"]].head()) # 查看转换后的结果
✅ ExterQual 变成了 0-4 之间的数值,可以用于模型训练!
示例输出:
ExterQual
0 2
1 3
2 2
3 3
4 2
💻 代码示例:One-Hot Encoding
📌 适用于无序类别变量,例如 Neighborhood(房屋所在社区):
df = pd.get_dummies(df, columns=["Neighborhood"], drop_first=True)
✅ 这样 Neighborhood 变成了多个 0/1 的列,每个社区对应一个新列,值为 1 表示该行属于该社区,0 表示不属于。让模型更容易学习!
📌 4. 数据标准化 & 归一化
🔹 为什么要标准化?
房价数据中,不同的特征有不同的数值范围:
LotArea(1000-5000)
SalePrice(50000-500000)
📌 如果不处理,机器学习模型会优先关注数值较大的特征(如 SalePrice),而忽略数值较小的特征(如房间数)。
✅ 解决方案:
- 标准化(StandardScaler):适用于数据呈正态分布
- 归一化(MinMaxScaler):适用于数据范围不均匀
💻 代码示例:标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[["LotArea", "GrLivArea", "SalePrice"]] = scaler.fit_transform(df[["LotArea", "GrLivArea", "SalePrice"]])
print(df[["LotArea", "GrLivArea", "SalePrice"]].head())
✅ 数据转换为均值 0,方差 1
示例输出:
LotArea GrLivArea SalePrice
0 -0.207142 0.370333 0.347273
1 -0.091886 -0.482512 0.007288
2 0.073480 0.515013 0.536154
3 -0.096897 0.383659 -0.515281
4 0.375148 1.299326 0.869843
💻 代码示例:归一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[["LotArea", "GrLivArea", "SalePrice"]] = scaler.fit_transform(df[["LotArea", "GrLivArea", "SalePrice"]])
print(df[["LotArea", "GrLivArea", "SalePrice"]].head())
✅ 数据范围调整到 [0,1] 之间
示例输出:
LotArea GrLivArea SalePrice
0 0.033420 0.259231 0.241078
1 0.038795 0.174830 0.203583
2 0.046507 0.273549 0.261908
3 0.038561 0.260550 0.145952
4 0.060576 0.351168 0.298709
📌 5. 保存清洗后的数据
df.to_csv("house-prices-cleaned.csv", index=False)
print("数据清洗完成,已保存到 house-prices-cleaned.csv!")
✅ 处理后的数据可用于后续训练模型
📌 总结
📌 数据预处理流程:
1️⃣ 读取数据,检查缺失值
2️⃣ 填充缺失值(中位数、None)
3️⃣ 转换类别变量(Label / One-Hot Encoding)
4️⃣ 标准化 & 归一化
5️⃣ 保存清理后的数据 🚀
📌 你的数据准备好了吗?试试运行代码!😊
更多推荐


所有评论(0)