机器学习基础篇(一)——线性回归

机器学习基础篇(一)——线性回归

数据之间可以有很多种不同的相互关系,因此,如果我们可以缩小选项的范围,并且编写更少的代码去分析这些数据,这将会对我们寻找的过程有所帮助。

其中有一种关系是线性相关关系,如果我们发现数据中有这种关系存在,我们就可以使用线性回归的方法来分析他们。

一、概述

线性回归是一种用来分析一个或多个自变量与一个因变量之间的线性关系的技术。它意味着数据中的点集中在一条直线周围。

而简单的线性回归仅仅涉及到单一的自变量。

1.具有线性关系的数据集案例

# 线性回归
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets,linear_model
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# step 1 创建一个数据集,方便后续分析
x,y=make_regression(n_samples=500,n_features=1,noise=25,random_state=0)
# step 2 将数据集 分割成训练集和测试集两部分
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=0)
# step 3 将数据绘制成图
sns.set_style('darkgrid')
sns.regplot(x_test,y_test,fit_reg=False)
# step 4 移除坐标轴
plt.xticks([])
plt.yticks([])
plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述
我们的目标是找到一个最佳拟合曲线,能够尽可能完美的模拟数据点的路径,下面是一个线性方程的实例。
例1一个线程方程:
y=a0+a1*x
我们已经知道x是自变量,而y是预测的因变量。a0和a1描述了拟合线的情况。a0称之为偏差,a1则称为权重。改变a0的值,拟合线将上下移动,改变a1的值,则会改变拟合线的斜率。线性回归技术有助于我们选择合适的a0和a1的值,此外,当我们拥有多个自变量的时候,需要使用多元线性回归的技术。增加额外的自变量需要增加更多的权重来拟合数据

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets,linear_model
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# step 1 创建分析数据集
x,y=make_regression(n_samples=500,n_features=1,noise=25,random_state=0)
# step 2 将数据集 分割成训练集和测试集,按照8:2的比例切分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
# step 3 创建一个现行相关的模型
regression=linear_model.LinearRegression()
# step 4 用训练集训练模型
regression.fit(x_train,y_train)
# step 5 用模型算出测试集的预测值
y_predictions=regression.predict(x_test)
# step 6 画出数据的散点图和拟合线的图
sns.set_style('darkgrid')
sns.regplot(x_test,y_test,fit_reg=False)
plt.plot(x_test,y_predictions,color='black')
# step 7 移除坐标轴
plt.xticks([])
plt.yticks([])
plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述

二、适合线性回归的条件

线性回归是一种有效的技术,但使用时需要选择适当的条件。

  • 当自变量和因变量之间具有线性相关,并且我们预测连续值的时候,线性回归就是一个恰当的选择
  • 当自变量和因变量之间是非线性关系或者因变量是离散值的时候,就不适合线性回归技术了(如下例)
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import linear_model,datasets
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# step 1 创建使用数据集
x,y=make_regression(n_samples=500,n_features=1,noise=25,random_state=0)
y=y**2

# step 2将数据及分为训练集和测试集,按照8:2的比例切分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)

# step 3 绘制图像
sns.set_style('darkgrid')
sns.regplot(x_test,y_test,fit_reg=False)

# step 4 移除坐标轴
plt.xticks([])
plt.yticks([])
plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述

1.将非线性相关关系转换为线性相关关系

当然,有时我们可以将非线性数据转换为线性相关的数据。例如:我们可以将对数应用于指数,就可以将非线性相关关系转换为线性相关关系,而后可以对转换后的数据使用线性回归技术

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from sklearn import linear_model,datasets
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# step 1 创建使用的数据集
x,y=make_regression(n_samples=500,n_features=1,noise=25,random_state=0)
y=np.exp((y+abs(y.min()))/75)
# step 2 将数据集分为训练集和测试集,按照8:2的比例切分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.2,random_state=0)
# step 3 绘制图像
sns.set_style('darkgrid')
sns.regplot(x_test,y_test,fit_reg=False)
# step 4 移除坐标轴
plt.xticks([])
plt.yticks([])

plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述
下图是用对数应用于因变量后输出的相同数据

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from sklearn import linear_model,datasets
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# step 1 创建使用的数据集
x,y=make_regression(n_samples=500,n_features=1,noise=25,random_state=0)
y=np.exp((y+abs(y.min()))/75)

# **********step 1.1 对数据进行对数转换*******************
y=np.log(y)

# step 2 将数据集分为训练集和测试集,按照8:2的比例切分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.2,random_state=0)
# step 3 绘制图像
sns.set_style('darkgrid')
sns.regplot(x_test,y_test,fit_reg=False)
# step 4 移除坐标轴
plt.xticks([])
plt.yticks([])

plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述

三、代价函数

当我们进行预测时,我们需要一些办法来判断预测的准确性。显然,代价函数可以帮助我们做到这一点,代价函数会将所有预测值和实际值进行比较,并且输出针对预测函数的评分

在代价函数中有两个非常重要的术语:偏差和平方偏差。

  • 偏差是描述预测值和实际值之间的差值:E=prediction-actual
  • 平方偏差展示了预测值和实际值之间的距离:E²=(prediction-actual)²

我们知道当prediction-actual=2和prediction-actual=-2的时候,实际值和预测值之间的距离是相同的。平方偏差则能更好的展示这一点,因为他们都将导致平方偏差的值为4.我们用均方误差(MSE)作为代价函数,它可以度量实际值和预测值的差异程度

MSE=1/n * ∑(prediction(i)-actual(i))²

代价函数十分重要,因为代价函数可以衡量我们预测结果的准确程度,而确定模型的准确性对于我们后续的研究十分重要

# 代价函数
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets,linear_model
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# step 1 创建分析数据集
x,y=make_regression(n_samples=500,n_features=1,noise=25,random_state=0)
# step 2 将数据集 分割成训练集和测试集,按照8:2的比例切分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
# step 3 创建一个线性相关的模型
regression=linear_model.LinearRegression()
# step 4 用训练集训练模型
regression.fit(x_train,y_train)
# step 5 用模型算出测试集的预测值
y_predictions=regression.predict(x_test)
# step 6 获取特定点的代价
point_number=2
x_sample=[x_test[point_number].item(),x_test[point_number].item()]
y_sample=[y_test[point_number].item(),y_predictions[point_number].item()]
# step 7 绘制图像
sns.set_style('darkgrid')
sns.regplot(x_test,y_test,fit_reg=False)
plt.plot(x_test,y_predictions,color='black')
plt.plot(x_sample,y_sample,color='red',label='cost',marker='o')
# step 8 增加一个注释
n=['actual value','prediction']
for i,txt in enumerate(n):
    plt.annotate(txt,(x_sample[i],y_sample[i]),xytext=(10,-10),textcoords='offset pixels',fontsize=20)
plt.legend(fontsize=20)
# step 9 移除坐标轴
plt.xticks([])
plt.yticks([])
plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述

1.减小cost的方法

较低的代价函数意味着数据值的平均误差较低,线条的拟合程度较高,模型更加的精确

  • 最小二乘法:最小二乘法是使得代价函数最小的常用方法,在此方法中,我们将数据视为一个矩阵,并且用线性代数来计算该矩阵方程中系数的最优解。幸运的是,我们不需要亲自使用线性代数去计算,而是使用Python代码来计算它
#创建一个线性回归对象
regr=linear_model.LinearRegression()
  • 梯度下降法
    梯度下降是一种猜测线性方程系数的迭代方法,以便最小化代价函数。梯度下降的名字起源于微积分中渐变的概念。这种方法通过略微移动系数的值,来监控代价函数是否降低。如果代价在几次迭代中持续增加,我们将会停止迭代,因为此时我们可能已经达到 了最低限度。另外,我们可以通过选择不同停止前的迭代次数和容差值来微调代价函数
#创建一个线性回归对象
regr=linear_model.SGDRegressor(max_iter=10000.tol=0.001)

自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子味的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值