使用python进行主成分回归

时间:2018-09-13 10:06:35

标签: python machine-learning

我有应变温度数据,并且已阅读该文章 https://www.idtools.com.au/principal-component-regression-python-2/

我正在尝试建立模型并预测温度之外的应变。

我得到以下结果,交叉验证是否定的。

我在这里设置了数据 http://www.mediafire.com/file/r7dg7i9dacvpl2j/curve_fitting_ahmed.xlsx/file

我的问题是交叉验证的结果有意义吗?

我的代码如下

输入是来自熊猫的数据框。

def pca_analysis(温度,应变):

# Import the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Import Data
print("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 object
pca = PCA()

Xstd = StandardScaler().fit_transform(xData)

# Run PCA producing the reduced variable Xred and select the first pc components
Xreg = pca.fit_transform(Xstd)[:, :2]

''' Step 2: regression on selected principal components'''

# Create linear regression object
regr = linear_model.LinearRegression()

# Fit
regr.fit(Xreg,W_A1)

# Calibration
y_c = regr.predict(Xreg)

# Cross-validation
y_cv = cross_val_predict(regr, Xreg, W_A1, cv=10)

# Calculate scores for calibration and cross-validation
score_c = r2_score(W_A1, y_c)
score_cv = r2_score(W_A1, y_cv)

# Calculate mean square error for calibration and cross validation
mse_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 plot
z = 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的结果

我将如何使用这些数据来改善预测?

enter image description here

1 个答案:

答案 0 :(得分:0)

the Scikit Documentation中,如果模型的随机性比随机性差,则r2_score给出的值可以为负。现在,显然这不是使用ML想要的;您期望更好胜于随机结果。

我要指出的第一件事是您的数据似乎是非线性的,在这种情况下PCA难以改善模型性能。

PCA的一种潜在替代品,它基本上解决了数据中的任何非线性问题,是使用自动编码器对数据进行预处理(有关这些here的好文章)。如果您在自动编码器的某些隐藏层上使用非线性激活函数,则它们可以解决数据中的非线性问题,这可能有助于模型的性能。网上有很多文章对此进行了解释,如果您选择继续学习此课程,请告诉我是否需要

接下来我要指出的是,r2_score并不是衡量误差的最佳方法,并且使用均方误差更为普遍,尤其是对于线性回归。因此,如果您想使模型保持如此简单,我将直接忽略r2_score并从那里继续。但是,话虽这么说,线性回归由于其简单性而不能用于解决非常复杂的问题,从您提供的图片来看,我很清楚线性回归在应用于该数据集。

我想知道PCA和非PCA应用数据之间的均方误差差异。在此,PCA的错误应该比非PCA正常应用的数据少。如果不是这样,则说明您的数据是非常非线性的(也许是?)或代码中有错误(我查看了一下,发现没有明显的错误)。对于线性回归,均方误差实际上几乎是所选择的一致误差函数,并且非常有效。希望这能回答您的问题,如果有我的答案,请留下评论/问题,我将尽力澄清。

另外,在回答您的问题时,我遇到了另外this个我认为可以很好地解释您的问题的问题(并且使用了一些数学方法,因此请做好准备)。最值得注意的是,在某些情况下,R ^ 2误差适合用于您的模型,但是考虑到您的结果,我想说R ^ 2误差可能是该数据的误差函数的较差选择。

更新:鉴于您获得的均方误差值,我的第一个猜测是PCA为1)要么无法正常工作数据性质,要么2)已实现错误地。虽然我不是您正在使用的库的专家,但我将确保您以相同的方式转换数据的 all ,即确保将PCA转换后的向量与转换后的向量进行比较。

为了继续进行线性回归,我将研究制作一个简单的神经网络或SVR(这可能会有些棘手)。实践证明,这两种方法都适用于复杂数据,并且适应性强。网上有大量资源可用于这两种方法,并且我认为具体说明这两种方法的实现可能不在这个问题的范围之内(您可能需要对此单独询问)。