用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 | 公平比较各类模型性能 |
📌 核心结论(代码体现的思想)
- 模型对比实验设计完整:从线性 → 非线性 → 深度学习,形成递进式分析。
- 可复现性保障:所有随机过程均设置
random_state=42
。 - 评估标准统一:使用准确率(Accuracy)作为统一指标。
- 工具链覆盖全面:结合了 scikit-learn 和 TensorFlow/Keras,展示了传统机器学习与深度学习的融合实践。
✅ 建议延伸:
- 可增加交叉验证(Cross-validation)提升评估稳定性。
- 可尝试调整神经网络结构(层数、神经元数)观察性能变化。
- 可输出更多指标如精确率、召回率、F1分数,尤其当类别不平衡时更合理。
📌 一句话总结:
本代码是一个完整的机器学习实验模板,涵盖了数据生成、模型训练、性能评估全流程,对比了逻辑回归、随机森林与神经网络三种典型模型在相同任务下的表现。
——The END——
🔗 欢迎订阅专栏
序号 | 专栏名称 | 说明 |
---|---|---|
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589