Sklearn LinearRegression返回错误相关系数,求助排查问题
问题排查与修正
你的代码存在两个核心问题,导致得到的结果并非你需要的“相关系数”:
1. 混淆了回归系数与相关系数
LinearRegression.coef_返回的是线性回归的斜率(回归系数),不是你要的皮尔逊相关系数。这是概念误解:回归系数表示自变量每变化1单位时因变量的变化量,而相关系数衡量两个变量线性关联的强度和方向,取值范围在[-1,1]之间。
2. X与y的赋值逻辑颠倒
你当前代码用quality作为自变量(X)去预测前10列的变量(y),这和常规分析逻辑(用理化指标预测quality)相反,也会导致结果不符合预期。
修正方案1:计算皮尔逊相关系数(你要的correlation coef)
如果目标是得到每个变量与quality的相关系数,用pandas的corr()方法更简单准确:
import pandas as pd df = pd.read_csv("Wine_RegionColor.csv") def get_correlations(): variables = df.columns[:10] correlations = {} for var in variables: # 计算皮尔逊相关系数 corr = df[var].corr(df['quality']) correlations[var] = round(corr, 6) # 保留6位小数方便查看 return correlations print(get_correlations())
更简洁的写法:
corr_series = df[df.columns[:10]].corrwith(df['quality']) print(corr_series)
修正方案2:正确计算线性回归系数(如果确实需要回归系数)
如果你要得到以各变量为自变量、quality为因变量的回归系数,需要交换X和y的赋值:
import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression df = pd.read_csv("Wine_RegionColor.csv") def linear_regression_calc(): variables = df.columns[:10] regression_coefs = {} for var in variables: # 纠正X和y:用当前变量作为自变量,quality作为因变量 X = df[var].values.reshape(-1, 1) y = df['quality'].values.reshape(-1, 1) model = LinearRegression() model.fit(X, y) # 绘图优化 plt.scatter(X, y) plt.plot(X, model.predict(X), color='red') plt.xlabel(var) plt.ylabel("Quality") plt.legend([f"Coefficient: {model.coef_[0][0]:.6f}"]) plt.show() regression_coefs[var] = model.coef_[0][0] return regression_coefs print(linear_regression_calc())
补充说明
- 相关系数是无量纲的,侧重线性关联程度;回归系数有单位,反映自变量对因变量的影响幅度。
- 若仅需查看变量与quality的线性关联强度,用相关系数更直观;若要构建预测模型,才需要关注回归系数。
内容的提问来源于stack exchange,提问作者jake
相关产品推荐
相关产品推荐

