这是我参与更文挑战的第4天,活动详情查看: 更文挑战
之前说过机器学习中的监督学习,监督学习既是提供了带标记的数据,即先把一部分已知的问题和答案(训练集)交给机器进行学习,机器在学习的过程中对数据拟合,生成了认为合适的模型,然后把新的问题交给机器,这时机器通过之前拟合出的模型的规律进行对新的问题进行推算解答.
举例来说,比如我们首先告诉机器不同年龄和性别对应的身高值,机器对大量的数据进行训练后,我们再提供给机器对应的年龄于性别他按照之前的模型来推算该年龄于性别对应的身高的任务.
在监督学习中主要又分为两种任务,即回归与分类.
- 回归问题
- 分类问题
回归既是预测连续的具体的数值的任务,而分类问题是对事务进行分门别类,用于离散型预测.
我们今天首先来看回归问题中的一种: 简单线性回归
简单线性回归中包含一个自变量(x)和一个因变量(y),以上两个变量的关系用一条直线来模拟,即回归线.
用公式可以表示为:
其中,a是估计线性方程的纵截距,b是估计线性方程的斜率.
但是我们预测的数值与实际数值之间的存在差异,假如的预测值为,实际值为,我们称与的差值为残差.
我们的目的是使得预测值尽可能地接近实际值,即残差越小越好。也就是说,当我们找到一组(a, b),使得残差平方和最小时,就说明在某种程度上,我们找到了预测效果最好的简单线性回归模型。
我们可以使用sklearn.linear_model
的LinearRegression
来解决简单线性回归问题
以工作工龄和薪资的关系举例,加入我们有如下数据:
Year | Salary |
---|---|
1.1 | 39343 |
1.3 | 46205 |
1.5 | 37731 |
2 | 43525 |
2.2 | 39891 |
2.9 | 56642 |
3 | 60150 |
3.2 | 54445 |
3.2 | 64445 |
3.7 | 57189 |
3.9 | 63218 |
首先通过数据预处理将数据分为X_train
,y_train
训练集于X_test
,y_test
测试集.
# 对训练集进行简单线性回归集合
from sklearn.linear_model import LinearRegression
# 创建回归器
regressor = LinearRegression()
# 拟合回归器
regressor.fit(X_train,y_train)
复制代码
这个通过对回归器的拟合可以对测试集进行预测
# 通过回归器预测结果
y_pred = regressor.predict(X_test)
复制代码
y_pred
既是通过简单线性回归预测的结果.
可以通过图标更加直观的来查看预测的结果
# 绘制测试集
plt.scatter(X_test,Y_test,color='red')
plt.plot(X_test,regressor.predict(X_test),color='blue')
plt.title('Salary Vs Experience - Training Set')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()
复制代码
我们完成了简单线性回归的相关处理,我们来看其他的回归问题,完整的代码如下:
# 导入基础库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
### 导入数据
dataset = pd.read_csv('data.csv')
# 设置自变量列,因变量列
X = dataset.iloc[:,:-1]. values
Y = dataset.iloc[:,1].values
### 生成训练集与测试集
from sklearn.model_selection import train_test_split
# 使用固定值生成训练集/测试集
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=1/3,random_state=0)
# 对训练集进行简单线性回归集合
from sklearn.linear_model import LinearRegression
# 创建回归器
regressor = LinearRegression()
# 拟合回归器
regressor.fit(X_train,Y_train)
# 预测测试集结果
y_pred = regressor.predict(X_test)
# 可视化对比
# 绘制训练集
plt.scatter(X_train,Y_train,color='red')
plt.plot(X_train,regressor.predict(X_train),color='blue')
plt.title('Salary Vs Experience - Training Set')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()
# 绘制测试集
plt.scatter(X_test,Y_test,color='red')
plt.plot(X_test,regressor.predict(X_test),color='blue')
plt.title('Salary Vs Experience - Training Set')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()
复制代码