Python sklearn 多元回归
Posted
技术标签:
【中文标题】Python sklearn 多元回归【英文标题】:Python sklearn poly regression 【发布时间】:2017-02-25 10:45:21 【问题描述】:我已经解决这个问题两天了。我有一些数据点放在scatter plot
中,然后得到:
这很好,但现在我还想添加一条回归线,所以我从 sklearn 中查看了这个 example 并将代码更改为这个
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
degrees = [3, 4, 5]
X = combined[['WPI score']]
y = combined[['CPI score']]
plt.figure(figsize=(14, 5))
for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i + 1)
plt.setp(ax, xticks=(), yticks=())
polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features), ("linear_regression", linear_regression)])
pipeline.fit(X, y)
# Evaluate the models using crossvalidation
scores = cross_val_score(pipeline, X, y, scoring="neg_mean_squared_error", cv=10)
X_test = X #np.linspace(0, 1, len(combined))
plt.plot(X, pipeline.predict(X_test), label="Model")
plt.scatter(X, y, label="CPI-WPI")
plt.xlabel("X")
plt.ylabel("y")
plt.legend(loc="best")
plt.title("Degree \nMSE = :.2e(+/- :.2e)".format(degrees[i], -scores.mean(), scores.std()))
plt.savefig(pic_path + 'multi.png', bbox_inches='tight')
plt.show()
输出如下:
请注意,X
和 y
的大小均为 DataFrames
,大小为 (151, 1)
。如果需要,我也可以发布 X 和 y 的内容。
我想要的是一条漂亮的平滑线,但我似乎无法弄清楚,如何做到这一点。
[编辑]
这里的问题是:如何获得一条平滑、弯曲的多项式线,而不是看似随机模式的多条线。
[编辑 2]
问题是,当我像这样使用linspace
时:
X_test = np.linspace(1, 4, 151)
X_test = X_test[:, np.newaxis]
我得到了一个更加随机的模式:
【问题讨论】:
这里的问题究竟是什么?这些是漂亮的流畅线条!有什么问题? 我想要一条带有曲线的平滑多项式线。目前我有多条线路,似乎是随机连接的。 虽然我不喜欢这里使用 matplotlib 的方式,但问题可能出在X_test
的形状内。检查预测的形状或输出。看起来,您正在并行预测多个事物并绘制所有内容。
我对 python 还是很陌生,matplotlib
有什么问题?我确实将X_test
设置为我原来的X
,因为我不确定还有什么可以放在那里。
matplotlib 没问题;我只是会以不同的方式使用它。是的,您的 X_test 内容是这里的问题。为什么不做与示例中相同的操作(因为您将其用作参考)。阅读 matplotlib 上的一些文档以了解 plt.plot() 中的 x 和 y 应该是什么。
【参考方案1】:
诀窍是设置如下代码:
X_test = np.linspace(min(X['GPI score']), max(X['GPI score']), X.shape[0])
X_test = X_test[:, np.newaxis]
plt.plot(X_test, pipeline.predict(X_test), label="Model")
这会产生以下结果(一条更好的单平滑线)
【讨论】:
以上是关于Python sklearn 多元回归的主要内容,如果未能解决你的问题,请参考以下文章
使用 sklearn - python 具有分类特征的多元线性回归
python sklearn 多元线性回归显示r-squared
Python使用sklearn-contrib-py-earth包构建多元自适应回归样条回归模型(Multivariate Adaptive Regression Splines,MARS)
Python使用sklearn和statsmodels构建多元线性回归模型(Multiple Linear Regression)并解读