我有应变温度数据,并且已经阅读了这篇文章https://www.idtools.com.au/principal-component-regression-python-2/
我正在尝试建立一个模型并根据温度预测应变。
我在交叉验证中得到了负结果。
我的数据集在这里http://www.mediafire.com/file/r7dg7i9dacvpl2j/curve_fitting_ahmed.xlsx/file
我的问题是交叉验证的结果是否合理?
我的代码如下
输入是来自panda的数据框。
def pca_analysis(temperature, strain):
# Import the librariesimport numpy as npimport matplotlib.pyplot as pltimport pandas as pd# Import Dataprint("process data")T1 = temperature['T1'].tolist()W_A1 = strain[0]N = len(T1)xData = np.reshape(T1, (N, 1))yData = np.reshape(W_A1, (N, 1))# Define the PCA objectpca = PCA()Xstd = StandardScaler().fit_transform(xData)# Run PCA producing the reduced variable Xred and select the first pc componentsXreg = pca.fit_transform(Xstd)[:, :2]''' Step 2: regression on selected principal components'''# Create linear regression objectregr = linear_model.LinearRegression()# Fitregr.fit(Xreg,W_A1)# Calibrationy_c = regr.predict(Xreg)# Cross-validationy_cv = cross_val_predict(regr, Xreg, W_A1, cv=10)# Calculate scores for calibration and cross-validationscore_c = r2_score(W_A1, y_c)score_cv = r2_score(W_A1, y_cv)# Calculate mean square error for calibration and cross validationmse_c = mean_squared_error(W_A1, y_c)mse_cv = mean_squared_error(W_A1, y_cv)print(mse_c)print(mse_cv)print(score_c)print(score_cv)# Regression plotz = np.polyfit(W_A1, y_c, 1)with plt.style.context(('ggplot')): fig, ax = plt.subplots(figsize=(9, 5)) ax.scatter(W_A1, y_c, c='red', s = 0.4, edgecolors='k') ax.plot(W_A1, z[1] + z[0] * yData, c='blue', linewidth=1) ax.plot(W_A1, W_A1, color='green', linewidth=1) plt.title('$R^{2}$ (CV): ' + str(score_cv)) plt.xlabel('Measured $^{\circ}$Strain') plt.ylabel('Predicted $^{\circ}$Strain') plt.show()
这是PCR的结果
我如何使用这些数据改进预测?
回答:
根据Scikit文档,如果你的模型比随机结果差得离谱,r2_score的值可能会是负数。显然,这不是使用机器学习所期望的结果;你期待的是比随机结果更好的表现。
首先,我要指出的是你的数据似乎可能相当非线性,在这种情况下,PCA很难提高模型性能。
一种可以替代PCA并能处理数据中几乎任何非线性的方法是使用自编码器来预处理数据(这方面有一篇很好的文章在这里)。如果你在自编码器的一些隐藏层中使用非线性激活函数,它们可以处理数据中的非线性,这可能会帮助你的模型表现。如果你选择追求这个方向,网络上有很多文章解释这个方法,如果你需要一些资源,请告诉我。
接下来我要指出的是,r2_score并不是衡量误差的最佳方式,使用均方误差更为常见,尤其是在线性回归中。所以,如果你想保持模型的简单性,我建议你忽略r2_score,继续前进。然而,尽管如此,线性回归由于其简单性,并不适合解决非常复杂的问题,从你提供的图片来看,很明显线性回归应用在这个数据集上效果很差。
我想知道PCA和非PCA处理数据之间的均方误差的差异。在这里,PCA处理的数据应该比普通的、未经PCA处理的数据有更小的误差。如果不是这样,那么要么你的数据非常非线性(可能是这样?),要么你的代码有错误(我浏览了一下,没有发现明显的问题)。对于线性回归,均方误差几乎是选择的唯一误差函数,并且非常有效。希望这回答了你的问题,如果你有关于我的回答的评论或问题,请留言,我会尽力澄清。
此外,在回答你的问题时,我发现了另一个问题,我认为它很好地解释了你的问题(并且使用了一些数学,所以请准备好)。最值得注意的是,有一些情况下使用R^2误差来衡量你的模型是合适的,但根据你的结果,我认为对于这个数据,R^2误差可能是一个不好的误差函数选择。
更新:根据你得到的均方误差值,我的第一个猜测是PCA 1) 要么因为数据的性质而不起作用,或者2) 实现不正确。虽然我不是你所使用的库的专家,但我会确保你以相同的方式转换所有数据,即确保PCA转换后的向量与转换后的向量进行比较。
为了超越线性回归,我建议你研究构建一个简单的神经网络或SVR(这可能会有点棘手)。这两种方法在处理复杂数据方面都已被证明是有效的,并且非常适应性强。关于这两者的在线资源非常丰富,我认为给出具体的实现细节可能超出了这个问题的范围(你可能需要就此提出一个单独的问题)。