自己造轮子——多元回归分析_基于Scikit-learn

数据的读取和处理

1
2
3
data=pd.read_excel('C:\\Users\\cyx94a\\Desktop\\Python\\data\\al6-1.xls')
sns.pairplot(data,x_vars=['Q','PL','PF','PK'],y_vars='TC',height=5,aspect=0.6,kind='reg') # 绘制散点图
plt.show()

关于pairplot:data指定数据来源,x_vars指定横坐标的种类,y_var指定纵坐标种类,height和aspect是调整输出图像的大小,kind=’reg’则添加一条最佳拟合直线和95%的置信区间
这地方摸索了半天,原来pairplot没办法自己输出图像,必须要借助matplotlib的show命令。size参数也不再用了,现在用height。

1
2
X=data[['Q','PL','PF','PK']] # 提取这4列创建新的DataFrame X
y=data['TC'] # 提取这1列创建新的Series y

整理数据,用DataFrame表征自变量矩阵X,用Series表征因变量y

构造训练集和测试集

1
2
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
print(X_train.shape)

sklearn.cross_validation这个方法已经过时了,现在应该改成sklearn.model_selection

X_train, X_test, y_train, y_test:这些是 train_test_split 函数返回的四个变量,分别代表分割后的训练集特征、测试集特征、训练集标签和测试集标签。

train_test_split(X, y):这个函数将 X 和 y 分别分割成训练集和测试集。默认情况下,训练集占总数据的 75%,测试集占 25%。

random_state=1:这是一个参数,用于控制随机数生成器的种子。设置 random_state 可以确保每次运行代码时,数据的分割方式是一致的,这有助于复现结果。

可以用print(X_train.shape)这样的代码打印出训练集特征 X_train 的形状,通常形状信息会告诉我们特征矩阵的行数(样本数)和列数(特征数)

线性回归

1
2
3
4
5
linreg=LinearRegression()
linreg.fit(X_train,y_train)
LinearRegression(copy_X=True,fit_intercept=True,n_jobs=1)
print(linreg.intercept_)
print(linreg.coef_)

linreg = LinearRegression(): 创建一个 LinearRegression 对象

linreg.fit(X_train, y_train): 使用训练数据集 X_train 和对应的标签 y_train 来训练(拟合)线性回归模型。

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False): 这是 LinearRegression 类的初始化参数,参数的含义如下:

copy_X=True: 在拟合数据前,是否复制数据矩阵X。如果设置为False,数据将直接修改而不保留原始数据。

fit_intercept=True: 是否计算截距。如果设置为False,模型将不会尝试计算截距。

n_jobs=1: 指定用于并行化的CPU核心数。1代表不使用并行化。

print(linreg.intercept_): 打印线性回归模型的截距。截距是线性模型

print(linreg.coef_): 打印线性回归模型的系数。系数是线性模型

预测和评价测度

1
2
y_pred=linreg.predict(X_test)
print(y_pred)

使用 predict 方法对测试集 X_test 中的数据进行预测。predict 方法会根据模型学习到的参数(截距和系数)来计算每个样本的预测标签值。

1
2
3
4
5
6
7
8
9
10
11
mse = mean_squared_error(y_test, y_pred) 
print("Mean Squared Error:", mse)

mae = np.mean(np.absolute(y_test - y_pred))
print("Mean Absolute Error:", mae)

rmse = np.sqrt(mse)
print("Root Mean Squared Error:", rmse)

r2 = r2_score(y_test, y_pred)
print("R-squared:", r2)

计算MSE、RMSE、MAE、R方

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pandas as pd
import numpy as np
import seaborn as sns # type: ignore
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split # type: ignore
from sklearn.linear_model import LinearRegression # type: ignore
from sklearn.metrics import mean_squared_error, r2_score # type: ignore

data=pd.read_excel('C:\\Users\\cyx94a\\Desktop\\Python\\data\\al6-1.xls')
sns.pairplot(data,x_vars=['Q','PL','PF','PK'],y_vars='TC',height=5,aspect=0.6,kind='reg') # 绘制散点图
plt.show()

X=data[['Q','PL','PF','PK']] # 提取这4列创建新的DataFrame X
y=data['TC'] # 提取这1列创建新的Series y

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1) # 构建训练集和测试集

linreg=LinearRegression()
linreg.fit(X_train,y_train)
LinearRegression(copy_X=True,fit_intercept=True,n_jobs=1)
print(linreg.intercept_) # 截距项
print(linreg.coef_) # 自变量系数

y_pred=linreg.predict(X_test) # 预测

mse = mean_squared_error(y_test, y_pred) # MSE
print("Mean Squared Error:", mse)

mae = np.mean(np.absolute(y_test - y_pred)) # MAE
print("Mean Absolute Error:", mae)

rmse = np.sqrt(mse)
print("Root Mean Squared Error:", rmse) # RMSE

r2 = r2_score(y_test, y_pred) # R-squared
print("R-squared:", r2)

自己造轮子——多元回归分析_基于Scikit-learn
http://example.com/2024/04/20/自己造轮子——多元线性回归_基于Scikit-learn/
作者
cyx94a
发布于
2024年4月20日
许可协议