Python sklearn 多元回归
Python sklearn poly regression
我这两天一直在解决这个问题。我在 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)
。如有必要,我也可以 post X 和 y 的内容。
我想要的是一条流畅的线条,但我似乎想不通,该怎么做。
[编辑]
这里的问题是:如何获得一条平滑、弯曲的多项式线,而不是多条具有看似随机模式的多项式线。
[编辑 2]
问题是,当我这样使用 linspace
时:
X_test = np.linspace(1, 4, 151)
X_test = X_test[:, np.newaxis]
我得到了一个更随机的模式:
诀窍是设置如下代码:
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")
产生以下结果(更好的单条平滑线)
我这两天一直在解决这个问题。我在 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)
。如有必要,我也可以 post X 和 y 的内容。
我想要的是一条流畅的线条,但我似乎想不通,该怎么做。
[编辑]
这里的问题是:如何获得一条平滑、弯曲的多项式线,而不是多条具有看似随机模式的多项式线。
[编辑 2]
问题是,当我这样使用 linspace
时:
X_test = np.linspace(1, 4, 151)
X_test = X_test[:, np.newaxis]
我得到了一个更随机的模式:
诀窍是设置如下代码:
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")
产生以下结果(更好的单条平滑线)