机器学习(二):线性回归
线性回归的原理与多个实战内容
文章目录
一、什么是回归?
回归的目的是为了预测,比如预测明天的天气温度,预测股票的走势…
回归之所以能预测是因为他通过历史数据,摸透了“套路”,然后通过这个套路来预测未来的结果。
二、什么是线性回归?
线性回归的位置如上图所示,它属于机器学习 – 监督学习 – 回归 – 线性回归。
先从定义看起:线性回归分析(Linear Regression Analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。本质上说,这种变量间依赖关系就是一种线性相关性,线性相关性是线性回归模型的理论基础。
例如:
- 身高:由父亲的身高、母亲的身高、家庭收入、所在地区等因素决
- 房价:由地段、面积、周围配套、时间等因素决定
- 房子」越大,「租金」就越高
- 「汉堡」买的越多,花的「钱」就越多
- 杯子里的「水」越多,「重量」就越大
线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合(加减乘除)起来,得到的结果和目标接近:
三、线性回归 VS 逻辑回归
线性回归和逻辑回归是 2 种经典的算法。经常被拿来做比较,下面整理了一些两者的区别
- 线性回归只能用于回归问题,逻辑回归虽然名字叫回归,但是更多用于分类问题
- 线性回归要求因变量是连续性数值变量,而逻辑回归要求因变量是离散的变量
- 线性回归要求自变量和因变量呈线性关系,而逻辑回归不要求自变量和因变量呈线性关系
- 线性回归可以直观的表达自变量和因变量之间的关系,逻辑回归则无法表达变量之间的关系
定义:
自变量:主动操作的变量,可以看做「因变量」的原因
因变量:因为「自变量」的变化而变化,可以看做「自变量」的结果。也是我们想要预测的结果。
在下一篇中学习逻辑回归,暂时只需要在这里做了解即可。
四、数据类型
如需分析数据,了解我们要处理的数据类型非常重要。我们可以将数据类型分为三种主要类别:
- 数值(Numerical)
- 分类(Categorical)
- 序数(Ordinal)
数值数据是数字,可以分为两种数值类别:
- 离散数据(Discrete Data):限制为整数的数字。例如:经过的汽车数量。
- 连续数据(Continuous Data):具有无限值的数字。例如:一件商品的价格或一件商品的大小。
分类数据是无法相互度量的值。例如:颜色值或任何 yes/no 值。
序数数据类似于分类数据,但可以相互度量。示例:A 优于 B 的学校成绩,依此类推。
五、线性回归
5.1 简单介绍
线性回归使用数据点之间的关系在所有数据点之间画一条直线。这条线可以用来预测未来的值。
在机器学习中,预测未来非常重要。
5.2 工作原理
例如:x 轴表示车龄,y 轴表示速度。我们已经记录了 13 辆汽车通过收费站时的车龄和速度。让我们看看我们收集的数据是否可以用于线性回归:
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y) # 绘制散点图
plt.show()
如图:
线性回归线具有Y = a + bX形式的方程,其中X是解释变量,Y是因变量。直线的斜率为b,a是截距。
核心思想是获得一条最适合数据的线。最佳拟合线是总预测误差(所有数据点)尽可能小的那一条。误差是点到回归线的距离。
六、案例
6.1 sklearn中的线性回归
sklearn中的线性回归模型如下:
from sklearn.linear_model import LinearRegression
sklearn.linear_model.LinearRegression()
它表示普通最小二乘线性回归。线性回归拟合具有系数 w = (w1, …, wp) 的线性模型,以最小化数据集中观察到的目标与通过线性近似预测的目标之间的残差平方和。它的完整参数如下:
sklearn.linear_model.LinearRegression(fit_intercept=True,
normalize=False, copy_X=True)
参数解释:
- fit_intercept, 是否计算此模型的截距,默认True。如果设置为 False,则不会在计算中使用截距
- normalize:数据标准化,默认为False。官方给的建议是用StandardScaler。
- copy_X:如果为 True,则 X 将被复制;否则,它可能会被覆盖。默认为True.
该模型的方法:
- fit(X, y[, sample_weight]):拟合线性模型。
- predict(X):使用线性模型进行预测。
- score(X, y[, sample_weight]):返回预测的确定系数,即R^2。
6.2 案例实现:价格预测
假设有例子,x和y分别表示某面积和总价,需要根据面积来预测总价。
第一步导入模块:
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
第二步:导入数据并绘制散点图
# 创建数据
x = np.array([6, 16, 26, 36, 46, 56]).reshape((-1, 1))
y = np.array([4, 23, 10, 12, 22, 35])
plt.scatter(x, y) # 绘制散点图
plt.show()
第三步:创建模型并拟合
model = LinearRegression().fit(x, y)
第四步:评估模型
r_sq = model.score(x, y)
print('确定系数:', r_sq)
第五步:获取线性回归模型中的参数
# 打印截距:
print('截距:', model.intercept_)
# 打印斜率
print('斜率:', model.coef_)
# 预测一个响应并打印它:
y_pred = model.predict(x)
print('预测结果:', y_pred, sep='\n')
输出:
6.3 案例实现:销售预测
数据集如下:
分别表示:
- TV:电视台
- Radio:广播
- Newspaper:报纸
- sales:销售价格
第一步:读取数据
import pandas as pd
data=pd.read_csv("advertising.csv")
data
如图:
回归方程别忘了:y=c+m1x1+m2x2+…+mn*xn
- y是预测值,是因变量
- c是截距
- m1是第一个特征
- m2是第二个特征
- mn是第n个特征
在这里我们只做电视和销售的关系,因此方程为:y=c+m1×TV
第二步:提取自变量和因变量
X = data['TV'].values.reshape(-1, 1) # 使其成为数组数组
y = data['Sales'].values
第三步: 分割训练集和测试集。将 70% 的数据保留在训练数据集中,其余 30% 保留在测试数据集中。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=100)
第四步:可视化一下
plt.scatter(X_train, y_train, color='purple')
plt.xlabel('X ')
plt.ylabel('y ')
plt.title("Scatter Plot")
plt.show()
如图:
第五步:建立模型
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
第六步:训练模型并使用模型预测
lr.fit(X_train, y_train)
y_predict = lr.predict(X_test) # 预测
第七步:评估模型。使用训练精确度和测试精确度。
print(f'Training accuracy: {round(lr.score(X_train, y_train)*100, 2)}%')
print(f'Training accuracy: {round(lr.score(X_test, y_test)*100, 2)}%')
输出为:
Training accuracy: 82.16%
Training accuracy: 72.81%
七、线性回归的优缺点
优点:
- 建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。
- 可以根据系数给出每个变量的理解和解释
缺点:不能很好地拟合非线性数据。所以需要先判断变量之间是否是线性关系。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)