通过这个案例【棉花产量论文作业的数据.csv】了解如何解决回归分析中多元共线性的问题
1、导入数据
import pandas as pd
import numpy as np
from scipy import stats
# 设置文件路径
file_path = '棉花产量论文作业的数据.csv'
# 使用 pandas 的 read_csv 函数读取 CSV 文件,注意查看csv文件的编码,默认不填为utf-8编码
data = pd.read_csv(file_path,encoding='gbk')
# 显示数据的前几行来验证读取是否成功
print(data.head())
2、数据预处理,观察是否有缺失值
print(data.isnull().any())
3、数据预处理,查看数据是否异常
# X要素是种子费、化肥费、农药费、机械费、灌溉费
X = data.iloc[:, 2:]
# Y要素是单产
Y = data.iloc[:, 1]
print(X)
print(Y)
发现有异常值,留给大家思考如何处理这个异常值
4、划分数据集并训练模型
# 将数据分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, Y_train)
5、根据评价指标来查看模型效果
# 预测测试集的结果
Y_pred = model.predict(X_test)
# 评估模型
mse = mean_squared_error(Y_test, Y_pred)
r2 = r2_score(Y_test, Y_pred)
print("Mean Squared Error:", mse)
print("R2 Score:", r2)
# 通过模型的系数和截距来查看每个X要素对Y的影响
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)
(注意,由于该题数据集数量过少导致评价指标差异有点过大,可以先忽略不计,拿例子去理解往后遇到的需要多元线性回归的题目)
针对如何以上评价指标的结果应如何改进?以下常见的有两种办法
6、计算共线性的第一种方法:相关系数矩阵
# 计算相关系数矩阵
correlation_matrix = X.corr()
print(correlation_matrix)
观察相关系数矩阵,如果两个变量之间的相关系数接近1或-1,则表明它们之间存在高度线性关系。
结果表明:种子费和化肥费、机械费、灌溉费;化肥费和机械费、灌溉费;机械费和灌溉费;以上均有共线性
7、计算共线性的第二种方法:方差膨胀因子(Variance Inflation Factor, VIF)¶
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 分类数据使用独热编码
# data['Gender'] = data['Gender'].map({'Male':0, 'Female':1})
# the independent variables set
X1 = data[['种子费', '化肥费', '农药费', '机械费', '灌溉费']]
# 计算VIF
vif_data = pd.DataFrame()
vif_data["feature"] = X1.columns
vif_data["VIF"] = [variance_inflation_factor(X1.values, i) for i in range(X1.shape[1])]
print(vif_data)
该题由于数据量过小,共线性太强,不适用于进行回归分析,该案例告诫同学谨慎选用线性回归分析。
留给大家思考用什么方法可以提升模型效果,可以用逐步回归模型哦