重生之从零开始的神经网络算法学习之路——第一篇 初学Scikit-learn(线性回归预测问题的实现)
熟读历史的你,深知当初明朝开国皇帝朱元璋,最初也只是一介草夫,正所谓万事开头难。而今重生后的你,面对这机器学习的世界,亦如当年朱元璋面对元末乱世,既感迷茫又怀揣着无限可能。
前情回顾
在序篇中,你已成功搭建了Python开发环境,配置了VSCode插件,创建了虚拟环境,并初步体验了模块安装与调试。此刻,你坐在电脑前,深吸一口气,决定正式迈入机器学习的大门。
初识Scikit-learn算法库
Scikit-learn(简称sklearn)是Python中最著名的机器学习库之一,它提供了各种分类、回归和聚类算法,包括支持向量机、随机森林、梯度提升、k均值等。对于重生后的你来说,这就像当年朱元璋得到了一本兵书,虽初读晦涩,却蕴含着改变命运的力量。
为何选择线性回归作为起点?
线性回归是机器学习中最基础且直观的算法,如同武术中的马步,看似简单却是所有高级技巧的根基。通过线性回归算法的学习,我们可以完整地了解到机器学习算法的基本流程:数据准备、模型训练、预测评估。
实验一:线性回归预测糖尿病进展(回归问题)
1. 环境准备
First of all,安装实验所需的第三方依赖库:
pip install scikit-learn matplotlib numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
- 其中scikit-learn就是我们的Scikit-learn库,调用模块名称为sklearn。
- matplotlib是经典的绘图库,用于数据可视化。它支持折线图、柱状图、散点图、饼图等多种图表类型,可高度定制图表样式。
- numpy是高性能数值计算库,提供多维数组对象(ndarray)及数学运算工具。其核心优势在于向量化运算,可显著提升大规模数据处理效率。
2. 代码实现
代码可以直接拉取,远程仓库代码地址:https://gitee.com/cmx1998/Scikit-Learning.git
- 具体文件为Scikit-learn-1.py
3. 代码解析
这段代码实现了以下功能:
- 数据加载:使用Scikit-learn内置的糖尿病数据集
- 数据分割:将数据分为训练集(80%)和测试集(20%)
- 模型训练:使用线性回归算法训练模型
- 预测评估:在测试集上进行预测并评估模型性能
- 可视化输出:生成多种图表帮助理解模型表现
- 导入所需模块
from sklearn.datasets import load_diabetes # sklearn内置的糖尿病数据集
from sklearn.linear_model import LinearRegression # 线性回归算法模型
from sklearn.model_selection import train_test_split # 训练集和测试集分割函数
from sklearn.metrics import mean_squared_error, r2_score # 模型性能评估函数
import matplotlib.pyplot as plt
import numpy as np
import os
- 数据加载
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target
feature_names = diabetes.feature_names
"""
:Attribute Information:
- age age in years
- sex
- bmi body mass index
- bp average blood pressure
- s1 tc, total serum cholesterol
- s2 ldl, low-density lipoproteins
- s3 hdl, high-density lipoproteins
- s4 tch, total cholesterol / HDL
- s5 ltg, possibly log of serum triglycerides level
- s6 glu, blood sugar level
:属性信息:
- age 年龄
- sex 性
- bmi 身体质量指数
- bp 平均血压
- s1 tc, 血清总胆固醇
- s2 ldl, 低密度脂蛋白
- s3 hdl, 高密度脂蛋白
- s4 tch, 总胆固醇/高密度脂蛋白
- s5 ltg, 可能是血清甘油三酯水平的对数
- s6 glu, 血糖水平
"""
- 数据分割
X_train , X_test , y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
) # 参数test_size设为0.2,即测试集占比为20%
- 模型训练
reg = LinearRegression()
reg.fit(X_train, y_train)
- 预测评估
# 预测
y_pred = reg.predict(X_test)
# 评估模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
- 可视化输出
# 省略详细步骤
plt.show()
4. 运行结果
运行代码后,你将会看到类似以下的输出:
============================================================
实验一:线性回归预测糖尿病进展
============================================================
正在加载糖尿病数据集...
数据集形状: (442, 10)
特征数量: 10
特征名称(英文): age, sex, bmi, bp, s1, s2, s3, s4, s5, s6
特征名称(中文): 年龄, 性别, 身体质量指数, 平均血压, 血清总胆固醇, 低密度脂蛋白, 高密度脂蛋白, 总胆固醇/高密度脂蛋白, 血清甘油三酯对数, 血糖水平
训练集样本数: 353
测试集样本数: 89
训练线性回归模型中...
训练完成!
============================================================
线性回归模型性能评估
============================================================
模型系数 (coef_): [ -35.55025079 -243.16508959 562.76234744 305.46348218 -662.70290089
324.20738537 24.74879489 170.3249615 731.63743545 43.0309307 ]
模型截距 (intercept_): 152.5380470138517
均方误差 (MSE): 3424.2593
决定系数 (R²): 0.3322
特征重要性:
age(年龄): -35.5503
sex(性别): -243.1651
bmi(身体质量指数): 562.7623
bp(平均血压): 305.4635
s1(血清总胆固醇): -662.7029
s2(低密度脂蛋白): 324.2074
s3(高密度脂蛋白): 24.7488
s4(总胆固醇/高密度脂蛋白): 170.3250
s5(血清甘油三酯对数): 731.6374
s6(血糖水平): 43.0309
特征重要性排序(按绝对值降序):
1. 血清甘油三酯对数(s5): 731.6374
2. 血清总胆固醇(s1): -662.7029
3. 身体质量指数(bmi): 562.7623
4. 低密度脂蛋白(s2): 324.2074
5. 平均血压(bp): 305.4635
6. 性别(sex): -243.1651
7. 总胆固醇/高密度脂蛋白(s4): 170.3250
8. 血糖水平(s6): 43.0309
9. 年龄(age): -35.5503
10. 高密度脂蛋白(s3): 24.7488
============================================================
可视化结果已保存为 'img\diabetes_prediction_results.png'
============================================================
实验一顺利完成!
============================================================
同时,程序还会生成一个包含四个子图的可视化结果,展示实际值与预测值的对比、残差分析以及重要特征与目标值的关系。
深入理解
1. 线性回归算法原理
线性回归试图找到一条直线(或超平面),使得所有数据点到这条直线的距离之和最小。Scikit-learn中的LinearRegression函数使用"普通最小二乘法(OLS)"算法来实现这一目标,即通过最小化残差平方和来求解最优模型参数。
2. 评估指标解读
- 均方误差(MSE):预测值与实际值差异的平方的平均值。值越小越好,表示预测越准确。在上述运行结果中,MSE为3424.26,这意味着平均每个预测值的平方误差约为3424。
- 决定系数(R²):表示模型对数据变动的解释程度。该系数取值范围为0-1,值越大表示模型拟合越好。在上述运行结果中R²值为0.332,意味着模型解释了约33.2%的数据变异。
结果分析:对于医学领域的复杂问题如糖尿病进展预测,由于当前数据集的特征值只有10个,所以R²不高是非常合理的。生物系统的复杂性意味着该病症的预测难以通过这10个特征捕捉。
3. 特征重要性分析
根据特征重要性排序结果,我们可以清晰地看到各特征对糖尿病进展的影响程度:
-
影响最大的特征:
s5(血清甘油三酯对数,731.64):对糖尿病进展有最强的正向影响bmi(身体质量指数,562.76):对糖尿病进展有很强的正向影响,符合医学常识,肥胖是糖尿病的重要风险因素s1(血清总胆固醇,-662.70):对糖尿病进展有显著的负向影响,这一结果可能需要进一步医学解释
-
中等影响特征:
s2(低密度脂蛋白,324.21):对糖尿病进展有中等正向影响bp(平均血压,305.46):对糖尿病进展有中等正向影响,高血压是糖尿病的常见并发症s4(总胆固醇/高密度脂蛋白,170.33):对糖尿病进展有中等正向影响
-
影响较小的特征:
sex(性别,-243.17):对糖尿病进展有中等负向影响,可能反映性别在糖尿病风险中的差异age(年龄,-35.55):对糖尿病进展有轻微负向影响s6(血糖水平,43.03):对糖尿病进展影响较小,这一结果不太符合医学常识s3(高密度脂蛋白,24.75):对糖尿病进展影响最小
遇到的挑战与解决
作为重生后的第一个项目,你难免会遇到一些问题:
- 中文显示问题:通过设置
plt.rcParams解决中文字体和负号显示问题 - 可视化布局:使用
plt.subplot创建多个子图,并通过plt.tight_layout()优化布局 - 结果解读:通过学习评估指标的含义,理解模型性能的好坏
结语
望着屏幕上成功运行后的代码结果和生成的可视化图表,你不禁感慨万分。这就像当年朱元璋攻下第一个城池,虽然只是漫长征程的开始,却证明了你完全有能力在这个新世界立足。
机器学习之路漫长而曲折,但每一步都充满开拓的喜悦。此刻的你,仿佛看到了未来的自己在人工智能的海洋中遨游,运用最新的技术解决业务上的难题。
下集预告:第二篇 深入Scikit-learn:分类问题与交叉验证
浙公网安备 33010602011771号