机器学习入门:线性回归原理梳理 + 多元回归实战 + 28万条真实数据建模全流程
一、先搞懂线性回归的核心逻辑
线性回归本质是通过数理统计的回归分析,确定变量之间相互依赖的定量关系。我们日常遇到的变量关联,主要分两类:
- 有明确因果的:比如工资水平影响贷款额度,能清晰区分自变量(原因)和因变量(结果),这类场景就用回归分析来研究
- 仅平行相关的:比如身高和体重,没有明确的谁影响谁,不区分自变量因变量,这类做相关分析即可
1. 一元与多元线性回归模型
最简单的是一元线性回归,只有一个自变量,公式如下:
y = β0 + β1 x + ε
其中β0是截距项,β1是回归系数(代表x每变化1个单位,y的变化量),ε是误差项,也就是除了线性关系之外的随机因素带来的偏差。
如果有多个自变量共同预测结果,就是多元线性回归,公式只是多了几组系数和变量:
y = β0 + β1 x1 + β2 x2 + ε
2. 模型求解:最小二乘法
线性回归有三个基础的误差假设:误差的期望为0、所有样本误差的方差一致、误差服从正态分布。我们求解模型参数的核心目标,就是让预测值和真实值的整体误差最小。这里用到的就是最小二乘法:把所有样本的误差平方后求和,让这个总和达到最小。这个结论是通过极大似然估计推导出来的,简单理解就是:默认我们拿到的样本就是最可能出现的情况,反过来反推最贴合这批样本的参数。最终可以通过矩阵运算直接求出参数解,实际写代码时不需要自己计算,工具库都已经封装好了。
3. 数据标准化
如果不同自变量的数值范围差距很大,模型会更容易被数值大的特征影响,导致结果偏差。这时候就需要做标准化,常用的有两种:
- 0-1标准化:把原始数据线性变换,映射到0到1的区间里
- Z标准化:用(原值-均值)除以标准差,处理后的数据均值为0、标准差为1,是建模里最常用的标准化方式
二、多元线性回归实战:用体重、年龄预测血压
先拿小数据集练手,这份数据一共13组样本,包含体重、年龄两个特征,以及对应的血压收缩值,我们的目标是建立模型,通过体重和年龄预测血压收缩值。
第一步:导入库与读取数据
import pandas as pd
from sklearn.linear_model import LinearRegression
#读取csv数据,处理编码格式
data = pd.read_csv("多元线性回归.csv", encoding='gbk', engine='python')
拿到数据后可以先算一下相关系数矩阵,直观看看变量之间的关联程度:
# 计算并打印相关系数矩阵
corr = data[["体重", "年龄", "血压收缩"]].corr()
print(corr)
第二步:拆分特征与标签,训练模型
把体重、年龄作为自变量,血压收缩作为因变量拆分出来,然后实例化模型直接训练即可。
# 自变量:体重、年龄
x = data[['体重', '年龄']]
# 因变量:血压收缩值
y = data[['血压收缩']]
# 建立线性回归模型并训练
lr_model = LinearRegression()
lr_model.fit(x, y)
第三步:模型评估与预测
训练完成后可以查看模型的系数和截距,同时用score方法评估拟合效果,返回的结果就是拟合优度R²,越接近1说明模型拟合效果越好。
# 查看模型参数
print("回归系数:", lr_model.coef_)
print("截距项:", lr_model.intercept_)
# 模型拟合评分
score = lr_model.score(x, y)
print("模型拟合得分:", score)
# 批量预测样本的血压值
y_pred = lr_model.predict(x)
print(y_pred)
跑出来的回归系数分别对应体重、年龄对血压的影响程度,正数就代表该指标越高,血压收缩值越高。这个小数据集样本量不大,主要是帮大家熟悉建模的完整流程。
三、大规模数据实战:28万条信用卡交易数据建模
小数据集跑通之后,我们用真实的业务数据练手。这份信用卡数据集一共约28万条交易记录,目标是识别欺诈交易,属于二分类任务,用到的逻辑回归可以理解为线性回归的延伸:在线性回归的基础上加入sigmoid函数,把输出映射到0-1的概率区间,用来判断分类。
第一步:数据读取与预览
import pandas as pd
# 读取数据集
data = pd.read_csv(r"./creditcard.csv")
# 查看前5行数据结构
print(data.head())
第二步:数据预处理
数据里的Time列是交易时间戳,对建模没有帮助,直接删除;Amount是交易金额,数值范围和其他脱敏特征差距很大,我们用Z标准化做归一化处理。
from sklearn.preprocessing import StandardScaler
# 实例化标准化工具
scaler = StandardScaler()
# 对交易金额做Z标准化
data['Amount'] = scaler.fit_transform(data[['Amount']])
# 删除Time列,axis=1表示按列操作
data = data.drop(['Time'], axis=1)
第三步:查看样本分布
欺诈场景的数据集通常都是极度不均衡的,正常交易占绝大多数,欺诈样本占比极低。我们可以画个柱状图直观看看分布情况。
import matplotlib.pyplot as plt
from pylab import mpl
# 设置中文显示,避免乱码
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False
# 统计正负样本数量
labels_count = pd.value_counts(data['Class'])
print(labels_count)
# 绘制柱状图
plt.title("正负例样本数")
plt.xlabel("类别")
plt.ylabel("频数")
labels_count.plot(kind='bar')
plt.show()
第四步:划分训练集与测试集
我们按7:3的比例拆分数据,70%用来训练模型,30%用来测试模型的泛化效果。固定random_state可以保证每次划分的结果一致,方便复现实验。
from sklearn.model_selection import train_test_split
# 特征集:去掉标签列Class
X_whole = data.drop('Class', axis=1)
# 标签集:分类结果(0正常,1欺诈)
y_whole = data.Class
# 划分训练集与测试集
x_train_w, x_test_w, y_train_w, y_test_w = \
train_test_split(X_whole, y_whole, test_size=0.3, random_state=1000)
第五步:模型训练与效果评估
from sklearn.linear_model import LogisticRegression
# 实例化逻辑回归模型,C为正则化参数,控制过拟合程度
lr = LogisticRegression(C=0.01)
# 用训练集训练模型
lr.fit(x_train_w, y_train_w)
# 测试集预测
test_pred = lr.predict(x_test_w)
# 查看测试集准确率
accuracy = lr.score(x_test_w, y_test_w)
print("测试集准确率:", accuracy)
因为这份数据集样本极度不均衡,单纯的准确率参考价值有限,实际业务中通常会用精确率、召回率、AUC等指标评估,入门阶段先跑通完整流程即可。
四、最后总结
线性回归作为机器学习的入门算法,逻辑非常直观,核心就是通过最小化误差来拟合变量间的线性关系。从简单的数值预测回归任务,到二分类的逻辑回归,底层思路是相通的。完整跑下来,从数据读取、预处理、数据集划分到模型训练、评估,一套标准的机器学习建模流程就都覆盖了。掌握这个基础之后,再去学更复杂的算法也会更容易上手。
更多推荐


所有评论(0)