기능과 결과 사이에 .corr ()이 큰 회귀에 대한 교차 점수가 매우 낮음
하나의 기능과 하나의 결과 사이에서 sklearn으로 회귀를 시도하고 있습니다. 이것은 내가 가지고있는 데이터 세트입니다.
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 ()을 사용하여 기능과 결과 간의 상관 관계를 찾았습니다.
bruto ukupno gradjevinski din
bruto 1.000000 0.878914
ukupno gradjevinski din 0.878914 1.000000
나는 corr이 0.87이고 그것은 회귀에 대해 매우 괜찮다고 생각하지만 회귀 모델을 만들고 교차 점수를 얻었을 때 나는 음수이고 1보다 큰 교차 점수 값을 얻습니다 (때로는 -50.23) 그리고 그것은 나에게 매우 이상합니다. 나는 많은 다른 모델과 다른 폴드 수로 시도했지만 결과는 동일합니다. 다음은 회귀 용 코드입니다.
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
Normalizer, StandardScaler 및 MinMaxScaler로 기능을 확장하려고 시도했지만 결과는 동일합니다. 도움이 필요하세요?
답변
다른 포럼에 내 답변을 게시하려고했지만 여기로 마이그레이션되었습니다.
명심해야 할 몇 가지 중요한 사항이 있습니다.
-
이기는 것은 최고의 알고리즘을 가진 사람이 아닙니다. 데이터가 가장 많은 사람입니다. (Banko와 Brill, 2001)
2001 년 Bank와 Brill은 4 개의 서로 다른 알고리즘을 비교해 교육 세트 크기를 수백만으로 늘렸고 위에 인용 된 결론을 내 렸습니다. 그리고 데이터가 너무 적습니다 !
- 선형 모델에 대해 이야기 할 때마다 그들의적인 이상치를 기억하십시오 . 데이터를 플로팅하면 명확하게 볼 수 있습니다.
cross_val_score
거의 모든 선형 모델 (예 : 회귀 자)에 대해 기본적으로 R ^ 2를 반환합니다. 이 측정 항목의 최상의 값은 1 (즉, 완전히 적합) 또는 = 0 (즉, 수평선)이거나, 음수 (즉, 수평선보다 나쁨) 일 수 있습니다. 여기에 더 많은 정보가 있습니다 . 다음으로 수행 한 실험에서 결과가 어떻게 유효한지 확인할 수 있습니다.대체 모델은 다음과 같습니다
Multi-layer Perceptron Regressor
. 레이어 수 = 3이면 모델은 복잡한 기능을 매핑합니다.데이터가 충분한 경우 교차 유효성 검사가 가장 효과적입니다. 그러나 귀하의 경우 CV 점수가 눈에 띄게 다릅니다.
다음과 같은 자명 한 실험의 결과를 생각해보십시오.
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)))
결과
이것은 하나의 극단 값 만 제거한 후입니다 ( 추가 탐색이나 이상 값 탐지기 사용과 같은 멋진 작업 수행없이 ). 보시다시피 모든 점에 맞는 단일 선은 없습니다.
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