我有一个多项式回归脚本,它可以正确地预测X和Y轴的值,在我的例子中,我使用的是CPU消耗,下面我们可以看到数据集的一个例子:
其中time
表示收集时间,例如:
1 = 1分钟2 = 2分钟
依此类推…
而consume
是该分钟内CPU的使用值,总结这个数据集展示了主机在30分钟内的行为,每个值对应一分钟,按升序排列(1分钟,2分钟,3分钟…)
结果如下:
使用以下算法:
# -*- coding: utf-8 -*-import numpy as npimport matplotlib.pyplot as pltimport pandas as pd# 导入数据集dataset = pd.read_csv('data.csv')X = dataset.iloc[:, 1:2].valuesy = dataset.iloc[:, 2].values# 将数据集拆分为训练集和测试集from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)# 对数据集进行多项式回归拟合from sklearn.preprocessing import PolynomialFeaturespoly_reg = PolynomialFeatures(degree=4)X_poly = poly_reg.fit_transform(X)pol_reg = LinearRegression()pol_reg.fit(X_poly, y)# 可视化多项式回归结果def viz_polymonial(): plt.scatter(X, y, color='red') plt.plot(X, pol_reg.predict(poly_reg.fit_transform(X)), color='blue') plt.title('CPU的多项式回归') plt.xlabel('时间范围') plt.ylabel('消耗') plt.show() returnviz_polymonial()# 20 = 时间print(pol_reg.predict(poly_reg.fit_transform([[20]])))
问题是什么?
如果我们复制这个数据集,使30分钟的范围出现2次,算法无法理解数据集,其结果也不够有效,数据集的示例如下:
注意: 在这种情况下,它有60个值,每30个值代表30分钟的范围,就像它们是不同的收集日一样。
它显示的结果是这样的:
目标: 我希望代表多项式回归的蓝色线条与第一个结果图像类似,上面展示的图像显示了一个循环,其中点被连接起来,好像算法出现了错误。
回答:
问题在于在第二种情况下,您使用X = 1, 2, … 30, 1, 2, … 30进行绘图。绘图函数会连接连续的点。如果您仅使用pyplot绘制散点图,您会看到漂亮的回归曲线。或者您可以使用argsort。以下是包含绿色散点图和黑色argsort线条的代码。
import numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom sklearn.linear_model import LinearRegression# 导入数据集# dataset = pd.read_csv('data.csv')dataset = pd.read_csv('data.csv')X = dataset.iloc[:, 1:2].valuesy = dataset.iloc[:, 2].values# 将数据集拆分为训练集和测试集from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)# 对数据集进行多项式回归拟合from sklearn.preprocessing import PolynomialFeaturespoly_reg = PolynomialFeatures(degree=4)X_poly = poly_reg.fit_transform(X)pol_reg = LinearRegression()pol_reg.fit(X_poly, y)# 可视化多项式回归结果def viz_polymonial(): plt.scatter(X, y, color='red') indices = np.argsort(X[:, 0]) plt.scatter(X, pol_reg.predict(poly_reg.fit_transform(X)), color='green') plt.plot(X[indices], pol_reg.predict(poly_reg.fit_transform(X))[indices], color='black') plt.title('CPU的多项式回归') plt.xlabel('时间范围') plt.ylabel('消耗') plt.show() returnviz_polymonial()# 20 = 时间print(pol_reg.predict(poly_reg.fit_transform([[20]])))