Özellik ve sonuç arasında büyük .corr () ile regresyon için çok düşük çapraz değer puanı

Aug 18 2020

Bir özellik ve bir sonuç arasında sklearn ile regresyon yapmaya çalışıyorum. Bu, sahip olduğum veri kümesi:

       bruto  ukupno gradjevinski din
0    2494.98                857951.27
1    2912.60                694473.11
2    3397.50               1310529.72
3    2678.00                199688.14
4    4310.00               1377366.95
5    2086.28                569312.33
6    3061.80                660803.42
7    4095.00               1187732.61
8    3997.00               1304793.08
9    6503.88               1659629.13
10   6732.00               1264178.31
11    940.10                172497.94
12   1543.00                598772.40
13   5903.85                809681.19
14   2861.61                333983.85
15   3682.76               1430771.50
16   2802.00               1145812.21
17   3032.00                356840.54
18   2635.00                543912.80
19   3749.00               1004940.27
20   4300.50               1889560.55
21   9722.00               2137376.95
22   3823.33                891633.50
23   1648.21                335115.40
24  24575.00              19273129.14
25   3926.00               1223803.28
26   3228.00                874000.00
27   4062.00               1090000.00
28   1316.24                332718.54
29   2497.99                519398.70
30  12123.94               2504783.69
31   2057.50                957042.37
32   2495.00                857951.27
33   3770.73               1743978.85
34    864.00                251269.48
35    774.71                192487.26

.Corr () ile özellik ve sonuç arasındaki ilişkiyi buldum:

                            bruto  ukupno gradjevinski din
bruto                    1.000000                 0.878914
ukupno gradjevinski din  0.878914                 1.000000

0,87'lik corr'um var ve bunun regresyon için çok uygun olduğunu düşünüyorum, ancak regresyon modeli yaptığımda ve çapraz değer puanı aldığımda, çapraz değer puanı için negatif ve 1'den büyük değer elde ediyorum (bazen -50,23) ve bu benim için çok garip. Bir çok farklı modelle ve farklı sayıda kıvrımlarla denedim ama sonuçlar aynı. Regresyon kodu budur:

features = df[['bruto']]
results = df[['ukupno gradjevinski din']]

regressors = [["Linear Regression", LinearRegression(normalize=False)],
              ["Lasso Regression", Lasso(normalize=False)],
              ["Gaussian Process Regressor", GaussianProcessRegressor()],              
              ["SVR linear", SVR(kernel = 'linear', gamma='scale', max_iter = 1500)],
              ["SVR poly 2", SVR(kernel = 'poly', degree=2, gamma='scale', max_iter = 1500)],
              ["SVR poly 3", SVR(kernel = 'poly', degree=3, gamma='scale', max_iter = 1500)],
              ["SVR poly 4", SVR(kernel = 'poly', degree=4, gamma='scale', max_iter = 1500)],
              ["SVR poly 5", SVR(kernel = 'poly', degree=5, gamma='scale', max_iter = 1500)],
              ["SVR rbf C=0.01", SVR(kernel = 'rbf', C=0.01, gamma='scale', max_iter = 1500)],              
              ["SVR rbf C=0.1", SVR(kernel = 'rbf', C=0.1, gamma='scale', max_iter = 1500)],
              ["SVR rbf C=0.5", SVR(kernel = 'rbf', C=0.5, gamma='scale', max_iter = 1500)],
              ["SVR rbf C=1", SVR(kernel = 'rbf', C=1, gamma='scale', max_iter = 1500)],              
              ["SVR rbf C=10", SVR(kernel = 'rbf', C=10.0, gamma='scale', max_iter = 1500)],
              ["SVR rbf C=20", SVR(kernel = 'rbf', C=20.0, gamma='scale', max_iter = 1500)],
              ["SVR rbf C=50", SVR(kernel = 'rbf', C=50.0, gamma='scale', max_iter = 1500)],              
              ["SVR sigmoid", SVR(kernel = 'sigmoid', gamma='scale', max_iter = 1500)],
              ["GradientBoostingRegressor", GradientBoostingRegressor()],
              ["RandomForestRegressor", RandomForestRegressor(n_estimators = 150)],
              ["DecisionTreeRegressor", DecisionTreeRegressor(max_depth=10)],
              ["Bagging Regressor TREE", BaggingRegressor(base_estimator = DecisionTreeRegressor(max_depth=15))],
              ["Bagging Regressor FOREST", BaggingRegressor(base_estimator = RandomForestRegressor(n_estimators = 100))],
              ["Bagging Regressor linear", BaggingRegressor(base_estimator = LinearRegression(normalize=True))],
              ["Bagging Regressor lasso", BaggingRegressor(base_estimator = Lasso(normalize=True))],
              ["Bagging Regressor SVR rbf", BaggingRegressor(base_estimator = SVR(kernel = 'rbf', C=10.0, gamma='scale'))],
              ["Extra Trees Regressor", ExtraTreesRegressor(n_estimators = 150)],
              ["K-Neighbors Regressor 1", KNeighborsRegressor(n_neighbors=1)],
              ["K-Neighbors Regressor 2", KNeighborsRegressor(n_neighbors=2)],
              ["K-Neighbors Regressor 3", KNeighborsRegressor(n_neighbors=3)],
              ["AdaBoostRegressor", AdaBoostRegressor(base_estimator=None)],
              ["AdaBoostRegressor tree", AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=15))],
              ["AdaBoostRegressor forest", AdaBoostRegressor(base_estimator=RandomForestRegressor(n_estimators = 100))],
              ["AdaBoostRegressor lin reg", AdaBoostRegressor(base_estimator=LinearRegression(normalize=True))],
              ["AdaBoostRegressor lasso", AdaBoostRegressor(base_estimator = Lasso(normalize=True))]]


for reg in regressors:

     try:

           scores = cross_val_score(reg[1], features, results, cv=5)
           scores = np.average(scores)
           print('cross val score', scores)
           print()

     except:
          continue

Özelliklerimi Normalizer, StandardScaler ve MinMaxScaler ile ölçeklendirmeye çalıştım ancak sonuçlar aynı. Herhangi bir yardım?

Yanıtlar

1 Yahya Aug 18 2020 at 06:41

Cevabımı diğer forumda yayınlamak üzereydim, ancak buraya taşındı.

Aklınızda bulundurmanız gereken birkaç önemli nokta var:

  1. Kazanan en iyi algoritmaya sahip olan değil. En çok veriye sahip olan kişi. (Banko ve Brill, 2001)

Bank ve Brill, 2001'de 4 farklı algoritma arasında bir karşılaştırma yaptılar, Eğitim Seti Büyüklüğünü milyonlara çıkarmaya devam ettiler ve yukarıda alıntılanan sonuca ulaştılar. Ve verileriniz çok az !

  1. Doğrusal Modeller hakkında ne zaman konuşursanız, düşmanlarını hatırlayın - Aykırı Değerler . Verilerinizi çizerseniz, bunu net bir şekilde görebilirsiniz.

  1. cross_val_scorehemen hemen tüm Doğrusal Modeller (yani Regresör) için varsayılan olarak R ^ 2'yi döndürür. Bu metriğin en iyi değeri = 1 (yani tamamen sığdır) veya = 0 (yani yatay çizgi) veya negatif olabilir (yani yatay bir çizgiden daha kötü). Daha fazla bilgi burada . Yaptığım deneyde, sonuçların nasıl geçerli olduğunu göreceksiniz.

  2. Alternatif bir model Multi-layer Perceptron Regressor; katman sayısı = 3 olduğunda, model herhangi bir karmaşık işlevi eşler.

  3. Çapraz Doğrulama, yeterli veriye sahipseniz en iyi hizmeti verir. Bununla birlikte, sizin durumunuzda, CV puanları önemli ölçüde farklılık gösterir.

Lütfen aşağıdaki açıklayıcı Deneyin sonuçlarını düşünün:

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.neural_network import MLPRegressor
from scipy.stats import pearsonr
import numpy as np
import matplotlib.pyplot as plt

X = np.array([2494.98,2912.6,3397.5,2678,4310,2086.28,3061.8,4095,3997,
              6503.88,6732,940.1,1543,5903.85,2861.61,3682.76,2802,3032,
              2635,3749,4300.5,9722,3823.33,1648.21,24575,3926,3228,4062,1316.24,
              2497.99,12123.94,2057.5,2495,3770.73,864,774.71]).reshape(-1, 1)

y = np.array([857951.27,694473.11,1310529.72,199688.14,1377366.95,569312.33,660803.42,1187732.61,
          1304793.08,1659629.13,1264178.31,172497.94,598772.4,809681.19,333983.85,1430771.5,1145812.21,
          356840.54,543912.8,1004940.27,1889560.55,2137376.95,891633.5,335115.4,19273129.14,1223803.28,
          874000,1090000,332718.54,519398.7,2504783.69,957042.37,857951.27,1743978.85,251269.48,192487.26])

X_, y_ = zip(*sorted(zip(X, y)))
plt.plot(X_, y_, '-x')
plt.title("Plot of Dataset")
plt.show()

print("Linear Regression :: Before Removing An Outlier")
reg = LinearRegression()
print(np.average(cross_val_score(reg, X, y, cv=3)))

X, y = X_[:-1], y_[:-1]
plt.plot(X, y, '-x')
plt.title("Plot of Dataset After Removing Outlier")
plt.show()

print("Linear Regression :: After Removing An Outlier")
reg = LinearRegression()
print(np.average(cross_val_score(reg, np.array(X).reshape(-1, 1), y, cv=3)))

print("Multi-layer Perceptron Regressor :: The Effect of Mapping Complicated / Non-Linear Function")
mlp = MLPRegressor(hidden_layer_sizes=(16, 16, 16), random_state=2020, activation='identity', max_iter=1000)
print(np.average(cross_val_score(mlp, np.array(X).reshape(-1, 1), y, cv=3)))

SONUÇLAR

Bu, yalnızca bir uç değeri kaldırdıktan sonra ( daha fazla araştırma yapmadan veya herhangi bir aykırı değer detektörü kullanmak gibi süslü işler yapmadan ). Gördüğünüz gibi, tüm noktalara uyan tek bir çizgi olmayacaktı.

Linear Regression :: Before Removing An Outlier
Average CVs Score: -1.7085612243433703

Linear Regression :: After Removing An Outlier
Average CVs Score: -0.12386365189238795

Multi-layer Perceptron Regressor :: The Effect of Mapping Complicated / Non-Linear Function
Average CVs Score: 0.16131374234257037