- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
1. 简单线性回归模型
一、概念
1. 回归:
- 在机器学习中,回归任务是指预测连续值的问题,例如房价、温度、销售额等。
- 回归模型通过学习输入特征(自变量)与输出目标(因变量)之间的关系来进行预测。
- 常见的回归算法包括线性回归、多项式回归、决策树回归、支持向量回归(SVR)和神经网络回归等。
2. 线性回归:
- 线性回归是最简单的回归分析形式,它假设自变量和因变量之间存在线性关系。
- 线性回归的目标是找到一条直线(在二维空间中)或一个平面(在三维空间中),最好地拟合数据集中的点。
- 这条直线(或平面)被称为回归线,它由截距(intercept)和斜率(slope)参数定义。
3. 回归与分类的区别:
- 在机器学习中,回归和分类是两种不同的任务。
- 分类任务是预测离散标签的问题,例如判断邮件是否为垃圾邮件、图片中是否包含某种物体等。
- 回归任务则是预测连续值的问题,如房价、温度、时间序列数据等。
二、代码学习
我的环境:
- 语言环境:cuda环境 Python 3.12.3
- 编译器:Jupyter Lab
这里我们采用“学习时长-成绩”数据集,采用LinearRegression简单线形回归模型,通过学习时长去预测学生成绩。
1. 数据预处理 (导入数据 + 数据集划分)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dataset = pd.read_csv("C:\\Users\\Zhao\\Desktop\\data\\studentscores.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=0.25)
2. 构建简单线性回归模型
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor = regressor.fit(X_train, Y_train)
解释:
(1)sklearn.linear_model
包实现了广义线性模型,包括线性回归、Ridge回归、Bayesian回归等。LinearRegression
是其中较为简单的线性回归模型。
(2) 这段代码初始化了一个线性回归模型,并使用训练数据集X_train
和Y_train
来训练这个模型。训练完成后,regressor
对象可以用来对新的特征数据进行预测,以估计目标变量的值。
(3) fit 的作用:找到最佳的线性关系,即最佳拟合线,来描述X_train
和Y_train
之间的关系。
3. 预测结果
Y_pred = regressor.predict(X_test)
4. 可视化
导入matplotlib.pyplot
模块后,可以使用它提供的各种函数来创建图表,如下:
import matplotlib.pyplot as plt
# 假设我们有一些数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 使用plt.plot()函数创建线图
plt.plot(x, y)
# 给图表添加标题和标签
plt.title("Simple Plot")
plt.xlabel("x axis label")
plt.ylabel("y axis label")
# 显示图表
plt.show()
回到原题:
(1)训练集可视化
plt.scatter(X_train, Y_train, color='red')
plt.plot(X_train, regressor.predict(X_train), color='blue')
plt.show()
(2)测试集可视化
plt.scatter(X_test, Y_test, color='red')
plt.plot(X_test, regressor.predict(X_test), color='blue')
plt.show()
三、通过鸢尾花花瓣长度预测花瓣宽度(练手项目)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['花萼-length', '花萼-width', '花瓣-length', '花瓣-width', 'class']
dataset = pd.read_csv(url, names=names)
X = dataset.iloc[ : , 2:3].values
Y = dataset.iloc[ : , 3].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25)
regressor = LinearRegression()
regressor = 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.show()
值得注意的是:
X = dataset.iloc[ : , 2:3].values 这行代码不能写成 X = dataset.iloc[ : , 2].values
原因:因为使用LinearRegression
模型时,它期望特征集X
是多维的(即形状为(n_samples,n_features)
的数组),而这里X
只有一维。如果你只使用一个特征来预测另一个特征,那么这种情况下模型是可以工作的,但通常这不是机器学习中的标准做法,因为模型将无法从多个特征中学习。
2. 多元线性回归模型
一、概念
1. 简单线性回归: 影响的因数唯一,只有一个。 Y = aX + b
2. 多元线性回归: 影响的因数不唯一,有多个。 Y = aX1 + bX2 + ... + nXn
二、 代码实现
下面通过 花萼-width 和 花瓣-length 来预测 花瓣-width
1. 数据预处理
(1)导入数据集
import numpy as np
import pandas as pd
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['花萼-length', '花萼-width', '花瓣-length', '花瓣-width', 'class']
dataset = pd.read_csv(url, names=names)
# url是包含CSV文件的网址,这里是一个字符串,指向鸢尾花数据集的在线资源
# 由于原始数据集没有列名,所以通过names=names参数指定列名,这样每列就有了一个明确的名称
(2)数据分析
import matplotlib.pyplot as plt
plt.plot(dataset['花萼-length'], dataset['花瓣-width'], 'x', label="marker='x'")
plt.plot(dataset['花萼-width'], dataset['花瓣-width'], 'o', label="marker='o'")
plt.plot(dataset['花瓣-length'], dataset['花瓣-width'], 'v', label="marker='v'")
# 这行代码绘制了花瓣长度与花瓣宽度之间的关系,使用的标记样式是倒三角形('v')
plt.legend(numpoints=1)
# 添加图例,每个标签只显示一个标记点
plt.show()
X = dataset.iloc[ : ,[1,2]].values
Y = dataset.iloc[ : , 3 ].values
(3)划分数据集
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
test_size=0.2,
random_state=0)
2. 训练多元线性回归模型
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, Y_train)
y_pred = regressor.predict(X_test)
plt.scatter(Y_test,y_pred, color='red')
plt.xlabel("True")
plt.ylabel("Prediction")
plt.show()
三、练手项目:用其他三个变量来预测花瓣长度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['花萼-length', '花萼-width', '花瓣-length', '花瓣-width', 'class']
dataset = pd.read_csv(url, names=names)
X = dataset.iloc[ : , [0,1,3]].values
Y = dataset.iloc[ : , 2].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
regressor = LinearRegression()
regressor.fit(X_train, Y_train)
y_pred = regressor.predict(X_test)
plt.scatter(Y_test, y_pred, color='blue')
plt.xlabel('True')
plt.ylabel('Prediction')
plt.show()