Skip to content

卫哥上课笔记 / 内部资料

2 数据分析与挖掘-实战指南 ​

数据分析与挖掘系列教程


"Talk is cheap. Show me the code." —— 这份指南旨在为您提供一个从数据准备到模型部署的完整、清晰且可操作的流程。

🛠 环境搭建 ​

为了顺利进行数据分析和建模,推荐使用 Anaconda,它集成了 Python 环境和众多常用的数据科学库。

1️⃣ 数据预处理 (Data Preprocessing) ​

这是机器学习中最耗时但至关重要的一步,高质量的数据是模型成功的基石。

1.1 数据准备 ​

  • 获取数据集: 数据可以来自多种渠道。

    • 官方机构: 政府、科研机构发布的数据集。
    • 竞赛平台: Kaggle, 天池等。
    • 学术资源: UCI 机器学习数据库等。
    • 网络爬虫: 自行编写爬虫从网站抓取。
  • 导入核心模块: 开始编码前,首先导入项目所需的基础库。

    python
    import 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())
    • 处理策略:

      1. 删除: 当缺失样本占比较高,或该特征不重要时。

        python
        # 删除所有包含缺失值的行
        df_dropped_rows = df.dropna()
        
        # 删除所有包含缺失值的列
        df_dropped_cols = df.dropna(axis=1)
        
        # 删除特定列
        # df.drop('column_name', axis=1, inplace=True)
      2. 填补:

        • 常数填充:
        python
        df_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 数据可视化 ​

  • 连续型数据:

    • 直方图与核密度图: 查看单变量分布。
    python
    sns.histplot(df['age'], kde=True)
    plt.title('年龄分布')
    plt.show()
    • 散点图: 查看两个连续变量间的关系。
    python
    sns.scatterplot(x='age', y='income', data=df)
    plt.title('年龄与收入关系')
    plt.show()
    • 箱线图/小提琴图: 比较不同类别下连续变量的分布。
    python
    sns.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()
  • 离散型数据:

    • 柱状图: 比较不同类别的数量。
    python
    sns.countplot(x='education_level', data=df)
    plt.title('不同教育水平人数')
    plt.xticks(rotation=45)
    plt.show()
    • 饼图: 展示不同类别的占比。
    python
    df['gender'].value_counts().plot.pie(autopct='%1.1f%%')
    plt.title('性别占比')
    plt.ylabel('') # 隐藏y轴标签
    plt.show()

3️⃣ 数据建模 (Modeling) ​

将处理好的数据用于构建、训练和测试机器学习模型。

3.1 特征工程 ​

  • 连续变量处理 (无量纲化): 消除不同特征间量纲和数量级的影响。

    • 标准化 (Standardization): 适用于数据近似高斯分布的情况。
    python
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    df['age_scaled'] = scaler.fit_transform(df[['age']])
    • 归一化 (Normalization): 将数据缩放到 [0, 1] 区间,适用于边界明显的特征。
    python
    from 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]
  • 时间序列处理:

    python
    df['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

基于 Vite 强力驱动 | 纯静态轻量托管