一、相关概念

1.1 什么是机器学习?

        机器学习(ML)是让机器自动学习,而不是基于规则的编程

        其英文是Machine Learning

1.2 什么是线性回归?

        我们知道,在机器学习中,我们需要使用训练集特征x_train和训练集标签y_train来训练模型。

        在机器学习中,有多种不同的问题,他们的任务各不相同,举例如下:

        回归问题:预测连续的数值输出

        分类问题:预测离散的类别标签

        ......

        回归问题的目标是预测一个连续的数值输出,而线性回归则通过建立输入特征特征x_train与输出目标y_train之间的线性关系来实现这一目标

二、线性回归问题分类

        线性回归问题主要分两大类:①一元线性回归;②多元线性回归

        一元很简单,只有一个变量x,这里不过多阐述,我们只讨论实用性更强的多元线性回归

三、Boston房价预测案例分析

        由于本网站不支持插入文件,因此无法上传Boston.csv数据集;

        由于数据庞大,只能粘贴部分表格,现贴上前五行数据:

CRIM

ZN

INDUS

CHAS

NOX

RM

AGE

DIS

RAD

TAX

PTRATIO

B

LSTAT

MEDV

0.00632

18

2.31

0

0.538

6.575

65.2

4.09

1

296

15.3

396.9

4.98

24

0.02731

0

7.07

0

0.469

6.421

78.9

4.9671

2

242

17.8

396.9

9.14

21.6

0.02729

0

7.07

0

0.469

7.185

61.1

4.9671

2

242

17.8

392.83

4.03

34.7

0.03237

0

2.18

0

0.458

6.998

45.8

6.0622

3

222

18.7

394.63

2.94

33.4

0.06905

0

2.18

0

0.458

7.147

54.2

6.0622

3

222

18.7

396.9

5.33

36.2

        该数据集的特征列名:

['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']

        可以看到,特征(x)有多个,因此这是一个多元线性回归问题

        该数据的标签列名:

['MEDV']

        我们的目标是:使用数据集训练回归模型,并预测房价

3.1 导包

import pandas as pd #用于读取csv文件
from sklearn.model_selection import train_test_split # 用于将数据集分割为训练集和测试集
from sklearn.preprocessing import StandardScaler # 用于数据标准化处理
from sklearn.linear_model import LinearRegression # 用于线性回归模型训练

3.2 获取数据

        从 ​​sklearn​​ 0.24 版本开始,​​load_boston​​ 函数被标记为过时,推荐使用 ​​fetch_openml​​ 函数加载数据集。

        ​​​​load_boston​ 无法使用的原因是有一个参数B涉嫌种族歧视,认为B对房价有影响

from sklearn.datasets import fetch_openml
boston = fetch_openml(name="boston", version=1, as_frame=True)
X = boston.data
y = boston.target

        由于是读取在线数据,可能因为网络问题导致代码无法运行下去。即使是这样,通过本文应该也可以理解线性回归

3.3 数据预处理

        数据预处理的目的是,将数据集按一定比例分为训练集和测试集,通常来说比例是8:2或7:2

        比例的大小关乎模型的正确率,可不断尝试最优比例

# 数据预处理
x_train,y_train,x_test,y_test = train_test_split(x,y,test_size = 0.2,random_state = 88)

        解析:

        train_test_split —— 已经在先前导入过,其作用是将数据集分割为训练集和测试集

        test_size —— 是分割的比例,0.2表示测试集占20%

        random_state —— 是随机数种子,当随机种子固定时,分割的结果也是固定的。

        如果不设定种子,那么分割结果就是随机的,不可以这样做,因为会导致每次训练得到的模型不同,也就无法对模型进行调优

        随机种子的不同关乎模型的正确率,可不断尝试最优种子

3.4 特征工程(Feature Engineering)

        3.4.1 什么是特征工程?

        由于特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些模型(算法)无法学习到其它的特征

        因此,我们需要进行特征工程(又称“特征预处理”),将原始数据进行标准化和归一化,并转换为更好地代表潜在问题的特征,以便提高机器学习模型的性能

        3.4.2 什么是标准化和归一化?

        标准化:通过对原始数据进行标准化,转换为均值为0标准差为1的标准正态分布的数据

        其公式为:

        

        mean是均值,σ是正态分布的标准差,无需记忆,你用不上这公式

        ——难道老板会让你手动标准化吗?除非他是一头猪

        归一化:通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间

        其公式为:

        max为数据的最大值,min为最小值,无需记忆

        3.4.3 什么是拟合和转换?

        对训练集进行拟合(fit):

                计算训练集中每个特征的统计信息(均值和标准差;

                建立标准化的规则和参数。

                对训练集进行转换(transform):

                使用前面计算得到的统计参数(均值和标准差)对数据进行实际的标准化处理;

                将原始数据转换为均值为0、标准差为1的标准正态分布形式。

        3.4.4 代码实现
# 先用fit_transform对训练集进行拟合和转换,计算训练集的均值和标准差
x_train = transfer.fit_transform(x_train)
# 再用transform对测试集进行转换,确保测试集使用相同的标准化参数,避免数据泄露
x_test = transfer.transform(x_test)

3.5 模型训练

        3.5.1 创建线性回归正规方程对象
# 创建线性回归正规方程对象
# es为模型对象;fit_intercept为是否需要计算偏置值,默认为True
es = LinearRegression(fit_intercept=True)
        3.5.2 模型训练
# 模型通过学习x_train(特征)和y_train(目标值)之间的关系来进行训练
# 损失函数计算:训练过程中,模型会比较预测值和y_train的真实值,计算误差并调整模型参数
# 模型优化目标:模型的目标是使预测值尽可能接近y_train中的真实值
# 简单来说,y_train就是训练数据中我们希望模型能够准确预测的"正确答案"
es = es.fit(x_train,y_train)

3.6 模型预测

# 模型预测,通过测试数据x_test生成预测数据(在这个案例里是房价)
y_predict = es.predict(x_test)

3.7 额外

print(f'预测结果:{y_predict}')
print(f'权重:{es.coef_}')
print(f"偏置:{es.intercept_}")
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐