【问题标题】:SVR/SVM output predictions are very similar to each other but far from true valueSVR/SVM 输出预测彼此非常相似,但与真实值相去甚远
【发布时间】:2023-03-21 01:35:01
【问题描述】:

主要思想是根据输入特征预测2个目标输出。

  1. 输入特征已经使用来自 sklearn 的 Standardscaler() 进行了缩放。 X_train 的大小为 (190 x 6),Y_train = (190 x 2)。 X_test 为 (20 x 6),Y_test = (20x2)

  2. linear 和 rbf 内核也利用 GridsearchCV 来寻找最佳的 C(线性)、gamma 和 C('rbf')

  3. [问题] 我在线性和 rbf 内核上使用 MultiOutputRegressor 执行 SVR,但是预测的输出彼此非常相似(不完全是常数预测)并且与 y 的真实值相差甚远。

  4. 下面是散点图表示 Y 的真实值的图。第一张图片对应于第一个目标的结果,Y[:,0]。而第二张图片是第二个目标,Y[:,1]。

  5. 我必须缩放我的目标输出吗?任何其他有助于提高测试准确性的模型?

  6. 我尝试了随机森林回归器并进行了调优,测试准确度与我使用 SVR 获得的准确度差不多。 (下面是 SVR 的结果)

    最佳参数:{'estimator__C': 1}
    MAE: [18.51151192 9.604601] #来自线性内核

    最佳参数 (rbf): {'estimator__C': 1, 'estimator__gamma': 1e-09} MAE (rbf): [17.80482033 9.39780134] #来自 rbf 内核

  7. 非常感谢!非常感谢任何帮助和输入! ^__^

---------------- 代码 -----------------

import numpy as np
from numpy import load

from sklearn.model_selection import train_test_split

from sklearn.svm import SVR
from sklearn.multioutput import MultiOutputRegressor
import matplotlib.pyplot as plt

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error 
from sklearn.model_selection import RepeatedKFold
rkf = RepeatedKFold(n_splits=5, n_repeats=3)


#input features - HR, HRV, PTT, breathing_rate, LASI, AI
X = load('200_patient_input_scaled.npy')
#Output features - SBP, DBP
Y = load('200_patient_output_raw.npy')

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.095, random_state = 43)

epsilon = 0.1

#--------------------------- Linear SVR kernel Model ------------------------------------------------------

linear_svr = SVR(kernel='linear', epsilon = epsilon)

multi_output_linear_svr = MultiOutputRegressor(linear_svr)
#multi_output_linear_svr.fit(X_train, Y_train) #just to see the output

#GridSearch - find the best C
grid = {'estimator__C': [1,10,10,100,1000] }
grid_linear_svr = GridSearchCV(multi_output_linear_svr, grid, scoring='neg_mean_absolute_error', cv=rkf, refit=True)
grid_linear_svr.fit(X_train, Y_train)

#Prediction
Y_predict = grid_linear_svr.predict(X_test)


print("\nBest parameter:", grid_linear_svr.best_params_ )
print("MAE:", mean_absolute_error(Y_predict,Y_test, multioutput='raw_values'))



#-------------------------- RBF SVR kernel Model --------------------------------------------------------
rbf_svr = SVR(kernel='rbf', epsilon = epsilon)
multi_output_rbf_svr = MultiOutputRegressor(rbf_svr)

#Grid search - Find best combination of C and gamma
grid_rbf = {'estimator__C': [1,10,10,100,1000], 'estimator__gamma': [1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2] }
grid_rbf_svr = GridSearchCV(multi_output_rbf_svr, grid_rbf, scoring='neg_mean_absolute_error', cv=rkf, refit=True)

grid_rbf_svr.fit(X_train, Y_train)

#Prediction
Y_predict_rbf = grid_rbf_svr.predict(X_test)


print("\nBest parameter (rbf):", grid_rbf_svr.best_params_ )
print("MAE (rbf):", mean_absolute_error(Y_predict_rbf,Y_test, multioutput='raw_values'))


#Plotting
plot_y_predict = Y_predict_rbf[:,1]
plt.scatter( np.linspace(0, 20, num = 20), Y_test[:,1], color = 'red')
plt.plot(np.linspace(0, 20, num = 20), plot_y_predict)

【问题讨论】:

    标签: python scikit-learn linear-regression svm gridsearchcv


    【解决方案1】:

    一个常见的错误是,当人们使用 StandardScaler 时,他们会沿着错误的数据轴使用它。您可以缩放所有数据,或者逐行而不是逐列,请确保您已正确执行此操作!我会手动执行此操作,因为否则我认为它需要不同的 StandardScaler 适合每个功能。

    [响应/编辑]:我认为这只是否定了 StandardScaler 通过反转应用程序所做的事情。我不完全确定 StandardScaler 的行为,我只是根据经验说这一切,并且在缩放多个特征数据时遇到了麻烦。如果我是你(例如 MInMax 缩放),我更喜欢这样的东西:

    columnsX = X.shape[1]
    for i in range(columnsX):
    
        X[:, i] = (X[:, i] - X[:, i].min()) / (X[:, i].max() - X[:, i].min())
    

    【讨论】:

    • 嘿@White_Sirilo,所以在我加载数组本身之前,我对原始 X 进行了快速检查。我将 StandardScaler().fit_transform(X) -> StandardScaler().inverse_transform(X) 应用于检查我是否取回了原始 X。这是否意味着 StandardScaler 是逐列执行的?
    • 我在上面编辑了我的评论,因为由于某种原因我无法将它变成这里的代码。
    • 嘿,我只是按照您的建议使用手动计算但使用不同的公式进行了尝试,并使用 SKlearn ColumnTransformer 确认它,但两者都产生相同的结果。
    猜你喜欢
    • 2018-11-06
    • 2020-07-05
    • 2017-04-25
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多