🌈🌈🌈机器学习 实战系列 总目录
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
1、简介
线性回归是一个有监督算法,根据多个自变量建立一个回归方程:
y
=
k
0
+
x
1
k
1
+
x
2
k
2
+
.
.
.
+
x
n
k
n
y = k_0+x_1k_1+x_2k_2+...+x_nk_n
y=k0+x1k1+x2k2+...+xnkn
其中:
- x 1 x_1 x1和 x n x_n xn等是原始输入,也就是自变量,也就是训练数据
- k 0 k_0 k0是误差项,即偏置,通过训练得到
- k 1 k_1 k1和 k n k_n kn等是权重参数,也就是可学习、可训练的参数,通过训练得到
- y是预测值,通过多组训练数据可以训练出一组比较好的权重参数和偏置,这个预测值可能是一个也可能是一组,根据自己任务定义的
- 此外和训练数据对应的还有各自的标签,也就是正确的结果
所以线性回归在作为一种机器学习方法训练过程中,就是为了找到一组合适的 k 1 k_1 k1和 k n k_n kn等权重参数,这组能够拟合出 x 1 x_1 x1和 x n x_n xn等原始输入的概率统计分布,使得线性回归算法预测的结果 y p r e d i c t i o n y_{prediction} yprediction和实际的真实值 y t r u e y_{true} ytrue不断接近
线性回归的目标是对一个或多个特征与连续目标变量之间的关系进行建模。
与分类任务相比,回归分析旨在预测连续输出,而不是类别标签。接下里,我们将介绍最基本的线性回归类型——简单线性回归。
2、简单例子实现
2.1 Scikit-learn
机器学习是一种人工智能方法,我们可以借助python工具包是scikit-learn来实现它,安装方法:
pip install scikit-learn
scikit-learn工具包中,有很多数据集、方法、机器学习算法都可以直接导入来用。
2.2 实现
接下来,我们将使用最小二乘法 (Least Squares),有时也称为线性最小二乘法,估计线性回归线的参数,该线性回归线能够使与训练样本的误差之和最小,并使用梯度下降算法训练回归线参数。要查看 LinearRegressionGD 回归器的实际效果,我们选择最好特征作为自变量,并训练一个可以预测 MEDV (房价)的模型。此外,我们将标准化自变量和目标变量以更好地收敛梯度下降算法,我们使用加州房价数据集,可以从Scikit-learn中加载现成的。
from sklearn.datasets import fetch_california_housing
import numpy as np
from matplotlib import pyplot as plt
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression
from sklearn.preprocessing import StandardScaler
if __name__ == '__main__':
housing = fetch_california_housing() # 加载数据
x = housing.data # 获取特征数据
y = housing.target # 目标房价信息
# 创建标准化对象
stand_x = StandardScaler()
stand_y = StandardScaler()
# 对特征数据进行标准化处理
x_std = stand_x.fit_transform(x)
y_std = stand_y.fit_transform(y[:, np.newaxis]).flatten()
best = SelectKBest(f_regression, k=1) # 根据回归结果,选择最好特征
best_x = best.fit_transform(x_std, y) # 拟合数据得到结果
print(best_x.shape)
这已经是一个很完整的代码了,复制下来就可以直接跑了。
将housing 打印出来看看:
3、数据集解析
结合2中的例子,看一下这个数据集的构成
housing = fetch_california_housing() # 加载数据
print(type(housing))
num_col = housing.keys()
print(num_col)
打印结果:
<class ‘sklearn.utils._bunch.Bunch’>
dict_keys([‘data’, ‘target’, ‘frame’, ‘target_names’, ‘feature_names’, ‘DESCR’])
sklearn.utils.Bunch之类的从sklearn中导出来的数据,很多都是这种格式,实质就是一个字典。当前数据集的这个字典包含了6个元素,它们的keys分别是:‘data’, ‘target’, ‘frame’, ‘target_names’, ‘feature_names’, ‘DESCR’,解释一下:
- data:原始数据数组,即训练数据
- target:数据标签,即真实数据
- frame:特殊返回值
- target_names:标签名
- feature_names:原始数据各个数据特征名
- DESCR:数据描述
看一下最重要的数据长什么样子:
housing = fetch_california_housing() # 加载数据
num_col = list(housing.keys())
data = np.array(housing.data)
print(data.shape)
打印结果:
(20640, 8)
一共两万条数据,每条数据包含8个特征,也就是说在1中的公式中,n=8
target = np.array(housing.target)
print(target.shape)
看下标签:
(20640,)
实际上我们就需要这两个数据,分别是x和y。
4、归一化
StandardScaler()是来自 sklearn.preprocessing
模块的一个类,其作用是进行特征缩放,使得所有特征的均值为 0,标准差为 1。这种处理方式也被称为数据的标准化(Standardization)或者 Z-Score 标准化。
在计算均值和标准差的同时进行缩放,可以使用 fit_transform
函数。
stand_x = StandardScaler()
stand_y = StandardScaler()
# 对特征数据进行标准化处理
x_std = stand_x.fit_transform(x)
y_std = stand_y.fit_transform(y[:, np.newaxis]).flatten()
print(x_std.shape)
print(y_std .shape)
打印结果:
(20640, 8)
(20640,)
为什么要进行归一化处理呢?我们拿到的数据,虽然我们认识,计算机也认识,但是机器学习不认识,机器学习只认识特征,机器学习是统计数据之前的概率分布的。所以我们需要进行归一化处理。
5、预测结果
归一化处理后就可以进行预测了:
best = SelectKBest(f_regression, k=1) # 根据回归结果,选择最好特征
best_x = best.fit_transform(x_std, y) # 拟合数据得到结果
print(best_x.shape)
(20640, 1)
这里就是对两万条原始数据都进行了预测,没有进行训练、验证、测试的数据集设置。
这就是一个很简单的线性回归过程,即简单线性回归。