2017-12-12 2 views
0

PCA를 사용하여 차원 축소를 수행하면 교육 데이터의 크기가 1200000이고 차원이 335입니다. 여기에 모델을 훈련하는 내 코드는PCA를 새 데이터에 적용하면 성능이 저하됨

X, y = load_data(f_file1) 
valid_X, valid_y = load_data(f_file2) 

pca = PCA(n_components=n_compo, whiten=True) 
X = pca.fit_transform(X) 
valid_input = pca.transform(valid_X) 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42) 
clf = DecisionTreeClassifier(criterion='entropy', max_depth=30, 
      min_samples_leaf=2, class_weight={0: 10, 1: 1}) # imbalanced class 
clf.fit(X_train, y_train) 

print(clf.score(X_train, y_train)*100, 
     clf.score(X_test, y_test)*100, 
     recall_score(y_train, clf.predict(X_train))*100, 
     recall_score(y_test, clf.predict(X_test))*100, 
     precision_score(y_train, clf.predict(X_train))*100, 
     precision_score(y_test, clf.predict(X_test))*100, 
     auc(*roc_curve(y_train, clf.predict_proba(X_train)[:, 1], pos_label=1)[:-1])*100, 
     auc(*roc_curve(y_test, clf.predict_proba(X_test)[:, 1], pos_label=1)[:-1])*100) 

print(precision_score(valid_y, clf.predict(valid_input))*100, 
     recall_score(valid_y, clf.predict(valid_input))*100, 
     accuracy_score(valid_y, clf.predict(valid_input))*100, 
     auc(*roc_curve(valid_y, clf.predict_proba(valid_input)[:, 1], pos_label=1)[:-1])*100) 

출력은

99.80, 99.32, 99.87, 99.88, 99.74, 98.78, 99.99, 99.46 
0.00, 0.00, 97.13, 49.98, 700.69 

그래서 리콜과 정밀도가 0입니다이다. 왜 PCA가 데이터 검증에 효과가없는 것 같고 모델이 과포화 된 것입니까? 그것은 너무 많은입니다

max_depth=30 

때문에

+3

X_train에만 pca를 맞추고 X_test에서 transform()을 수행해야합니다. 현재 전체 X에 대해 PCA를 수행하고 있으며이를 기차와 테스트로 분할합니다. 이는 지나치게 적합합니다. –

답변

1

은 아마 그것은 과다 적합합니다.

PCA 크기는 어떻게 선택 했습니까? 최적의 값은 고유 벡터/고유의 접근 방식을 통해 얻을 수 있습니다 : 당신이 X 값으로 선택

data = data.values 
mean = np.mean(data.T, axis=1) 
demeaned = data - mean 
evals, evecs = np.linalg.eig(np.cov(demeaned.T)) 
order = evals.argsort()[::-1] 

evals = evals[order] 

plt.plot(evals) 
plt.grid(True) 
plt.savefig('_!pca.png') 

최적의 값을 어디에 매우 제로 다운 라인 드롭.

관련 문제