卫哥上课笔记 / 内部资料
2 数据分析与挖掘-实战指南
数据分析与挖掘系列教程
"Talk is cheap. Show me the code." —— 这份指南旨在为您提供一个从数据准备到模型部署的完整、清晰且可操作的流程。
🛠 环境搭建
为了顺利进行数据分析和建模,推荐使用 Anaconda,它集成了 Python 环境和众多常用的数据科学库。
- 下载与安装: 访问 Anaconda 官方网站下载并安装适合您操作系统的版本。
1️⃣ 数据预处理 (Data Preprocessing)
这是机器学习中最耗时但至关重要的一步,高质量的数据是模型成功的基石。
1.1 数据准备
获取数据集: 数据可以来自多种渠道。
- 官方机构: 政府、科研机构发布的数据集。
- 竞赛平台: Kaggle, 天池等。
- 学术资源: UCI 机器学习数据库等。
- 网络爬虫: 自行编写爬虫从网站抓取。
导入核心模块: 开始编码前,首先导入项目所需的基础库。
pythonimport pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings # 忽略不必要的警告信息 warnings.filterwarnings("ignore") # 设置可视化样式 sns.set_style('whitegrid') # 解决中文显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] # 或者 'Songti SC', 'Microsoft YaHei' plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题读取与理解数据:
- 读取: 使用 Pandas 读取数据文件。
python# 根据文件类型选择合适的读取函数 df = pd.read_csv('your_data.csv') # df = pd.read_excel('your_data.xlsx')- 初步探查: 快速了解数据的基本情况。
python# 查看数据维度 (行数, 列数) print(df.shape) # 查看前5行数据 print(df.head()) # 查看数据基本信息 (列名, 非空值数量, 数据类型) print(df.info()) # 查看数值型特征的描述性统计 print(df.describe()) # 查看离散型特征的描述性统计 print(df.describe(include=['object']))- 明确目标: 理解每个特征(自变量)的业务含义,并确定要预测或分析的目标变量(因变量)。
- 自变量(X)与 因变量(y)
1.2 数据清洗
重复值处理:
- 检查:
python# 检查是否存在重复行 print(f"重复行数量: {df.duplicated().sum()}")- 处理:
python# 删除重复行,并直接在原DataFrame上修改 df.drop_duplicates(inplace=True)缺失值处理:
- 检查:
python# 查看每列的缺失值数量 print(df.isnull().sum()) # 检查数据集中是否存在任何缺失值 print(df.isnull().values.any())处理策略:
删除: 当缺失样本占比较高,或该特征不重要时。
python# 删除所有包含缺失值的行 df_dropped_rows = df.dropna() # 删除所有包含缺失值的列 df_dropped_cols = df.dropna(axis=1) # 删除特定列 # df.drop('column_name', axis=1, inplace=True)填补:
- 常数填充:
pythondf_filled_zero = df.fillna(value=0)- 前/后向填充: 适用于时间序列数据。
python# 使用前一个非缺失值填充 df_ffilled = df.fillna(method='ffill') # 使用后一个非缺失值填充 df_bfilled = df.fillna(method='bfill')- 统计值填充 (最常用):
python# 使用字典为不同列指定不同的填充值 fill_values = { 'age': df['age'].mean(), # 均值填充年龄 'income': df['income'].median(), # 中位数填充收入 'gender': df['gender'].mode()[0] # 众数填充性别 } df.fillna(value=fill_values, inplace=True)
异常值处理:
- 观察: 使用箱线图或散点图可以直观地发现异常点。
python# 使用箱线图观察'age'特征的分布和异常点 sns.boxplot(x=df['age']) plt.title('年龄特征箱线图') plt.show()- 处理: 异常值的处理需结合业务理解,可以是删除、替换或视为特殊情况。
卫哥上课笔记 / 内部资料
2️⃣ 数据分析 (Exploratory Data Analysis, EDA)
通过探索性分析和可视化,深入挖掘数据背后的规律和关联。
2.1 探索性分析
- ✅ 连续型数据: 查看其分布、中心趋势、离散程度。
- ✅ 离散型数据: 查看其类别、频次、占比。
2.2 数据可视化
连续型数据:
- 直方图与核密度图: 查看单变量分布。
pythonsns.histplot(df['age'], kde=True) plt.title('年龄分布') plt.show()- 散点图: 查看两个连续变量间的关系。
pythonsns.scatterplot(x='age', y='income', data=df) plt.title('年龄与收入关系') plt.show()- 箱线图/小提琴图: 比较不同类别下连续变量的分布。
pythonsns.boxplot(x='gender', y='income', data=df) plt.title('不同性别的收入分布') plt.show()- 热力图: 展示多个连续变量间的相关性。
python# 计算相关系数矩阵 corr_matrix = df.corr(numeric_only=True) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm') plt.title('特征相关性热力图') plt.show()离散型数据:
- 柱状图: 比较不同类别的数量。
pythonsns.countplot(x='education_level', data=df) plt.title('不同教育水平人数') plt.xticks(rotation=45) plt.show()- 饼图: 展示不同类别的占比。
pythondf['gender'].value_counts().plot.pie(autopct='%1.1f%%') plt.title('性别占比') plt.ylabel('') # 隐藏y轴标签 plt.show()
3️⃣ 数据建模 (Modeling)
将处理好的数据用于构建、训练和测试机器学习模型。
3.1 特征工程
连续变量处理 (无量纲化): 消除不同特征间量纲和数量级的影响。
- 标准化 (Standardization): 适用于数据近似高斯分布的情况。
pythonfrom sklearn.preprocessing import StandardScaler scaler = StandardScaler() df['age_scaled'] = scaler.fit_transform(df[['age']])- 归一化 (Normalization): 将数据缩放到 [0, 1] 区间,适用于边界明显的特征。
pythonfrom sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() df['income_scaled'] = scaler.fit_transform(df[['income']])离散变量处理:
- 独热编码 (One-Hot Encoding): 将类别变量转换为多个0/1变量,避免引入序数关系。
python# 使用pandas的get_dummies函数 df_dummies = pd.get_dummies(df, columns=['gender', 'city'], drop_first=True)- 标签编码 (Label Encoding): 将类别转为数值,适用于有序类别或树模型。
python# 使用pandas的factorize df['education_encoded'] = pd.factorize(df['education_level'])[0]时间序列处理:
pythondf['date'] = pd.to_datetime(df['date_string']) df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month
3.2 特征选择
相关系数法: 优先选择与目标变量相关性高的特征。
python# 计算所有特征与目标变量'target'的相关性 corr_target = df.corr(numeric_only=True)['target'].abs().sort_values(ascending=False) print(corr_target)
3.3 数据拆分
将数据集划分为训练集和测试集,用于训练模型和评估其泛化能力。
python
from sklearn.model_selection import train_test_split
# 假设 'target' 是因变量,其余是自变量 X
X = df.drop('target', axis=1)
y = df['target']
# 按照 80% 训练集, 20% 测试集进行拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)3.4 模型选择与构建
根据问题类型(回归/分类/聚类)选择合适的算法。
- 回归 (预测数值):
LinearRegression,Ridge,Lasso,RandomForestRegressor,GradientBoostingRegressor - 分类 (预测类别):
LogisticRegression,KNeighborsClassifier,SVC,DecisionTreeClassifier,RandomForestClassifier
示例:构建随机森林分类器
python
from sklearn.ensemble import RandomForestClassifier
# 1. 调用模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
# 2. 训练模型 (使用训练集)
model.fit(X_train, y_train)
# 3. 模型预测 (使用测试集)
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1] # 获取正类的预测概率,用于ROC/KS卫哥上课笔记 / 内部资料
4️⃣ 模型评估 (Evaluation)
量化模型的性能表现。
4.1 回归模型评估
python
from sklearn.metrics import mean_squared_error, r2_score
# 均方误差 (MSE),越小越好
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差 (MSE): {mse:.4f}")
# 均方根误差 (RMSE),越小越好
rmse = np.sqrt(mse)
print(f"均方根误差 (RMSE): {rmse:.4f}")
# R方 (R-squared),越接近1越好
r2 = r2_score(y_test, y_pred)
print(f"R方 (R²): {r2:.4f}")4.2 分类模型评估
python
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, roc_auc_score
# 准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.4f}")
# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:\n", conf_matrix)
# 使用热力图可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel('预测值')
plt.ylabel('真实值')
plt.title('混淆矩阵')
plt.show()
# 分类报告 (包含精确率、召回率、F1分数)
class_report = classification_report(y_test, y_pred)
print("分类报告:\n", class_report)
# ROC曲线和AUC值
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
auc = roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr, tpr, label=f'ROC 曲线 (AUC = {auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--') # 随机猜测线
plt.xlabel('假正例率 (FPR)')
plt.ylabel('真正例率 (TPR)')
plt.title('ROC 曲线')
plt.legend()
plt.show()5️⃣ 模型优化与总结
5.1 模型优化 (网格搜索)
使用交叉验证和网格搜索来寻找模型的最佳超参数组合。
python
from sklearn.model_selection import GridSearchCV
# 定义要搜索的参数网格
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10]
}
# 设置网格搜索
# cv=5 表示5折交叉验证, n_jobs=-1 表示使用所有CPU核心
grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42),
param_grid=param_grid,
cv=5,
scoring='accuracy',
verbose=1,
n_jobs=-1)
# 在训练数据上执行搜索
grid_search.fit(X_train, y_train)
# 输出最佳结果
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.4f}")
# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
# ... 后续评估📋5.2 项目总结
- 最优模型: 明确哪个模型和哪组参数表现最好。
- 性能表现: 总结模型在关键评估指标上的具体数值。
- 模型不足: 分析模型的局限性,例如在哪些数据上表现不佳,可能的原因是什么。
- 改进方向: 提出未来可以尝试的改进点,如获取更多特征、尝试更复杂的模型等。
- 项目收获: 总结从项目中学到的知识和经验。
© 2026 卫の课程教学资料
仅限学员学习使用,禁止任何形式传播
仅限学员学习使用,禁止任何形式传播
📢 版权声明:本文首发于 [https://zhangwei.gitbook.io],禁止非法爬取或转载。 验证指纹 ID:GB-2026-0109