71、实战:模型选择与训练【用Python进行AI数据分析进阶教程】

用Python进行AI数据分析进阶教程71

实战:模型选择与训练


关键词:逻辑回归、随机森林、神经网络、模型选择、过拟合

摘要:本文围绕机器学习项目中的模型选择与训练展开,强调在实战中需首先明确问题类型与数据特征,进而合理选择模型。对比了逻辑回归、随机森林和神经网络等模型的特性与适用场景,指出应在模型性能与复杂度之间取得平衡。通过示例代码演示了数据划分、模型训练、预测与评估的完整流程。重点提醒关注数据质量、过拟合与欠拟合问题,并根据计算资源合理选择模型。旨在帮助读者系统掌握模型选择与训练的核心方法与实践技巧。

👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏


一、关键点

1理解问题和数据

  • 明确问题类型判断是分类、回归、聚类还是其他类型的问题,这直接决定了可以选择的模型范围。例如,预测客户是否会购买产品是分类问题,预测房价则是回归问题。
  • 数据探索了解数据的特征、分布、缺失值情况等。这有助于确定是否需要进行数据预处理,以及选择合适的模型。

2模型选择

  • 模型特性不同的模型有不同的优缺点和适用场景。例如,线性模型(如线性回归、逻辑回归)简单易懂,计算效率高,但可能无法处理复杂的非线性关系;决策树和随机森林可以处理非线性关系,但容易过拟合;深度学习模型(如神经网络)能处理高度复杂的数据,但需要大量的数据和计算资源。
  • 性能和复杂度平衡在选择模型时,需要平衡模型的性能和复杂度。简单的模型可能在小规模数据集上表现良好,而复杂的模型可能在大规模数据集上才能发挥优势。

3模型训练

  • 数据划分将数据集划分为训练集、验证集和测试集。训练集用于模型学习,验证集用于调整模型的超参数,测试集用于最终评估模型的性能。
  • 超参数调整不同的模型有不同的超参数,如学习率、树的深度、隐藏层的神经元数量等。通过调整超参数可以提高模型的性能。

二、注意点

1数据质量

  • 缺失值处理数据中的缺失值可能会影响模型的性能,需要进行适当的处理,如删除缺失值、填充均值或中位数等。
  • 异常值处理异常值可能会导致模型过拟合,需要进行识别和处理,如使用箱线图或 Z - score 方法。

2过拟合和欠拟合

  • 过拟合模型在训练集上表现很好,但在测试集上表现不佳。可以通过正则化、增加数据量、减少模型复杂度等方法来避免过拟合。
  • 欠拟合模型在训练集和测试集上表现都不好。可以通过增加模型复杂度、特征工程等方法来解决欠拟合问题。

3计算资源和时间

  • 深度学习模型通常需要大量的计算资源和时间进行训练。在选择模型时,需要考虑自己的计算资源和时间限制。

三、示例代码及解读

以下是一个包含机器学习(逻辑回归、随机森林)和深度学习(简单的神经网络)模型选择与训练的示例代码:

Python脚本

# 导入numpy库,用于进行数值计算
import numpy as np

# 从sklearn库的datasets模块导入make_classification函数,用于生成分类数据集
from sklearn.datasets import make_classification

# 从sklearn库的model_selection模块导入train_test_split函数,用于划分训练集和测试集
from sklearn.model_selection import train_test_split

# 从sklearn库的linear_model模块导入LogisticRegression类,用于逻辑回归模型
from sklearn.linear_model import LogisticRegression

# 从sklearn库的ensemble模块导入RandomForestClassifier类,用于随机森林分类模型
from sklearn.ensemble import RandomForestClassifier

# 从sklearn库的metrics模块导入accuracy_score函数,用于计算分类准确率
from sklearn.metrics import accuracy_score

# 导入tensorflow库,用于构建和训练深度学习模型
import tensorflow as tf

# 从tensorflow.keras.models模块导入Sequential类,用于构建顺序模型
from tensorflow.keras.models import Sequential

# 从tensorflow.keras.layers模块导入Dense类,用于定义全连接层
from tensorflow.keras.layers import Dense


# 生成示例数据集
# n_samples=1000:生成1000个样本
# n_features=10:每个样本有10个特征
# n_informative=5:其中5个特征具有判别信息
# n_redundant=0:不生成冗余特征
# random_state=42:确保结果可复现
X, y = make_classification(
    n_samples=1000,
    n_features=10,
    n_informative=5,
    n_redundant=0,
    random_state=42
)


# 划分数据集为训练集和测试集
# test_size=0.2:测试集占总数据的20%
# random_state=42:确保每次划分结果一致
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)


# 逻辑回归模型
# 创建逻辑回归模型实例
logreg = LogisticRegression()

# 使用训练数据拟合模型
logreg.fit(X_train, y_train)

# 对测试集进行预测
y_pred_logreg = logreg.predict(X_test)

# 计算预测准确率
accuracy_logreg = accuracy_score(y_test, y_pred_logreg)

# 输出逻辑回归模型的准确率
print(f"Logistic Regression Accuracy: {accuracy_logreg:.4f}")


# 随机森林模型
# 创建随机森林分类器实例
rf = RandomForestClassifier(random_state=42)

# 使用训练数据拟合模型(添加random_state以确保可复现性)
rf.fit(X_train, y_train)

# 对测试集进行预测
y_pred_rf = rf.predict(X_test)

# 计算预测准确率
accuracy_rf = accuracy_score(y_test, y_pred_rf)

# 输出随机森林模型的准确率
print(f"Random Forest Accuracy: {accuracy_rf:.4f}")


# 简单的神经网络模型
# 使用Sequential构建一个前馈神经网络
model = Sequential([
    # 第一个隐藏层:10个神经元,ReLU激活函数
    # 输入形状根据训练数据的特征数自动确定
    Dense(10, activation='relu', input_shape=(X_train.shape[1],)),
    
    # 输出层:1个神经元,Sigmoid激活函数,适用于二分类
    Dense(1, activation='sigmoid')
])


# 编译模型
# 使用Adam优化器
# 二分类任务使用binary_crossentropy作为损失函数
# 监控训练过程中的准确率
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)


# 训练模型
# epochs=10:训练10轮
# batch_size=32:每批使用32个样本
# validation_data:使用测试集作为验证数据,监控过拟合
model.fit(
    X_train,
    y_train,
    epochs=10,
    batch_size=32,
    validation_data=(X_test, y_test),
    verbose=1  # 显示训练进度
)


# 在测试集上评估模型性能
# evaluate返回损失和指定的指标(此处为准确率)
_, accuracy_nn = model.evaluate(X_test, y_test, verbose=0)

# 输出神经网络模型的准确率
print(f"Neural Network Accuracy: {accuracy_nn:.4f}")

输出 / 打印结果说明

  • Logistic Regression Accuracy: [准确率数值]:这里会输出逻辑回归模型在测试集上的准确率,准确率是一个介于 0 到 1 之间的数值,越接近 1 表示模型性能越好。
  • Random Forest Accuracy: [准确率数值]:输出随机森林分类器在测试集上的准确率。
  • 训练神经网络模型时,会输出每个轮次(epoch)的训练损失、训练准确率、验证损失和验证准确率,例如:

plaintext

Epoch 1/10

25/25 [==============================] - 0s 3ms/step - loss: 0.6932 - accuracy: 0.5000 - val_loss: 0.6932 - val_accuracy: 0.5000

...

Epoch 10/10

25/25 [==============================] - 0s 2ms/step - loss: 0.2232 - accuracy: 0.9125 - val_loss: 0.2101 - val_accuracy: 0.9200

  • Neural Network Accuracy: [准确率数值]:最后输出神经网络模型在测试集上的最终准确率。

需要注意的是,具体的准确率数值会因数据的随机性(虽然设置了random_state,但不同环境可能仍有细微差异)而有所不同。

四、重点语句解读

以下是对以上代码的重点语句进行解读,从数据生成、模型构建到评估过程进行分步解析,突出其核心思想与技术要点:


🔹 1. 数据生成:make_classification

X, y = make_classification(
    n_samples=1000,
    n_features=10,
    n_informative=5,
    n_redundant=0,
    random_state=42
)
  • 作用:生成一个用于二分类任务的模拟数据集。
  • 解读
    • n_samples=1000:共1000个样本。
    • n_features=10:每个样本有10个特征。
    • n_informative=5:其中5个特征对分类有判别能力(信息量大)。
    • n_redundant=0:无冗余特征(即不通过其他特征线性组合生成的特征),保证特征独立性。
    • random_state=42:确保每次运行结果一致,提高实验可复现性。
  • ✅ 意义:快速构建可控的实验数据,便于比较不同模型性能。

🔹 2. 数据划分:train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
  • 作用:将数据划分为训练集(80%)和测试集(20%)。
  • 解读
    • 训练集用于模型学习参数。
    • 测试集用于评估模型泛化能力。
    • random_state=42 再次确保划分方式固定。
  • ✅ 意义:标准机器学习流程的第一步,防止过拟合评估偏差。

🔹 3. 逻辑回归模型:线性分类器基准

logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred_logreg = logreg.predict(X_test)
accuracy_logreg = accuracy_score(y_test, y_pred_logreg)
print(f"Logistic Regression Accuracy: {accuracy_logreg:.4f}")
  • 作用:建立一个线性分类模型作为性能基准。
  • 解读
    • 逻辑回归假设特征与类别之间存在线性关系。
    • 模型简单、解释性强,常作为“基线模型”(Baseline)。
  • ✅ 意义:后续复杂模型应优于或至少不差于逻辑回归,否则说明复杂化无效。

🔹 4. 随机森林模型:集成学习代表

rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"Random Forest Accuracy: {accuracy_rf:.4f}")
  • 作用:使用集成学习中的随机森林进行非线性分类。
  • 解读
    • 随机森林由多个决策树组成,通过投票提升稳定性与准确性。
    • 能捕捉非线性关系和特征交互,通常比逻辑回归表现更好。
    • random_state=42 保证结果可复现。
  • ✅ 意义:体现传统机器学习中高性能模型的能力,适合中小规模结构化数据。

🔹 5. 神经网络模型:深度学习尝试

model = Sequential([
    Dense(10, activation='relu', input_shape=(X_train.shape[1],)),
    Dense(1, activation='sigmoid')
])
  • 作用:构建一个简单的前馈神经网络(全连接网络)。
  • 解读
    • Sequential:按顺序堆叠层的模型结构。
    • 第一层 Dense(10, relu):含10个神经元的隐藏层,ReLU激活函数引入非线性。
    • 第二层 Dense(1, sigmoid):输出层,Sigmoid激活适用于二分类输出概率。
    • input_shape=(X_train.shape[1],):输入维度为特征数量(10维)。
  • ✅ 意义:展示如何用Keras搭建基础神经网络模型。

🔹 6. 模型编译:定义训练目标

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)
  • 作用:配置模型的优化方式与评价标准。
  • 解读
    • optimizer='adam':自适应学习率优化算法,收敛快、效果好。
    • loss='binary_crossentropy':二分类任务的标准损失函数。
    • metrics=['accuracy']:训练过程中监控准确率。
  • ✅ 意义:编译步骤是Keras模型训练前的必要准备。

🔹 7. 模型训练:model.fit

model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=32,
    validation_data=(X_test, y_test),
    verbose=1
)
  • 作用:在训练集上训练神经网络,并在测试集上验证。
  • 解读
    • epochs=10:遍历整个训练集10次。
    • batch_size=32:每次更新权重使用32个样本(小批量梯度下降)。
    • validation_data:每轮结束后在测试集上计算损失和准确率,监控是否过拟合。
    • verbose=1:显示训练进度条。
  • ✅ 意义:实现端到端的深度学习训练流程。

🔹 8. 模型评估:model.evaluate

_, accuracy_nn = model.evaluate(X_test, y_test, verbose=0)
print(f"Neural Network Accuracy: {accuracy_nn:.4f}")
  • 作用:评估神经网络在测试集上的最终性能。
  • 解读
    • evaluate 返回损失值和指定指标(这里是准确率)。
    • 忽略第一个返回值(损失 _),只保留准确率。
    • verbose=0:静默模式,不输出进度。
  • ✅ 意义:客观衡量模型泛化能力,与其他模型横向对比。

✅ 总结:核心流程与设计思想

步骤关键技术目的
数据生成make_classification构造可控实验环境
数据划分train_test_split分离训练与测试,防止数据泄露
基线模型逻辑回归提供简单模型性能基准
复杂模型随机森林利用集成方法提升精度
深度模型神经网络(Keras)探索非线性建模能力
统一评估accuracy_score / evaluate公平比较各类模型性能

📌 核心结论(代码体现的思想)

  1. 模型对比实验设计完整:从线性 → 非线性 → 深度学习,形成递进式分析。
  2. 可复现性保障:所有随机过程均设置 random_state=42
  3. 评估标准统一:使用准确率(Accuracy)作为统一指标。
  4. 工具链覆盖全面:结合了 scikit-learn 和 TensorFlow/Keras,展示了传统机器学习与深度学习的融合实践。

✅ 建议延伸

  • 可增加交叉验证(Cross-validation)提升评估稳定性。
  • 可尝试调整神经网络结构(层数、神经元数)观察性能变化。
  • 可输出更多指标如精确率、召回率、F1分数,尤其当类别不平衡时更合理。

📌 一句话总结

本代码是一个完整的机器学习实验模板,涵盖了数据生成、模型训练、性能评估全流程,对比了逻辑回归、随机森林与神经网络三种典型模型在相同任务下的表现。

——The END——


🔗 欢迎订阅专栏

序号专栏名称说明
1用Python进行AI数据分析进阶教程《用Python进行AI数据分析进阶教程》专栏
2AI大模型应用实践进阶教程《AI大模型应用实践进阶教程》专栏
3Python编程知识集锦《Python编程知识集锦》专栏
4字节跳动旗下AI制作抖音视频《字节跳动旗下AI制作抖音视频》专栏
5智能辅助驾驶《智能辅助驾驶》专栏
6工具软件及IT技术集锦《工具软件及IT技术集锦》专栏

👉 关注我 @理工男大辉郎 获取实时更新

欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男大辉郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值