데이터의 상관관계를 확인하는 코드는 다음과 같다.
import pandas as pd
import numpy as np
corr_matrix = df.corr().abs()
threshold = 0.8
for column in corr_matrix:
correlated_cols = corr_matrix[column][corr_matrix[column] > threshold].index.tolist()
correlated_cols.remove(column)
if correlated_cols:
print(column)
데이터에 상관관계가 0.8보다 큰 열이 많은 상황에 직면했을 때, 변수 간의 다중공선성이 높다는 것을 의미한다. 다중공선성은 불안정한 계수 추정 및 개별 변수가 대상 변수에 미치는 영향을 해석하는 일에서 문제를 일으킬 수 있다.
해결방법은 다음과 같다.
중복 변수 제거
기능 선택 기술: RFE, Lasso 정규화, pca 분석
정규화 기술: Ridge 회귀, Elastic Net
도메인 지식 활용
더 많은 데이터 수집
중복 변수를 제거하는 코드는 다음과 같다.
import pandas as pd
import itertools
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
data = pd.read_csv('your_dataset.csv')
target_column = 'target' # Replace 'target' with your actual target column name
features = data.drop(target_column, axis=1)
target = data[target_column]
column_names = features.columns
highest_accuracy = 0.0
best_feature_column = None
for num_columns_to_remove in range(1, min(21, len(column_names) + 1)):
combinations = itertools.combinations(column_names, num_columns_to_remove)
for comb in combinations:
subset_features = features.copy()
subset_features.drop(list(comb), axis=1, inplace=True)
X_train, X_test, y_train, y_test = train_test_split(subset_features, target, test_size=0.2, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
if accuracy > highest_accuracy:
highest_accuracy = accuracy
best_feature_column = comb
print(f"Columns removed: {comb}\tAccuracy: {accuracy}")
print(f"\nBest feature column: {best_feature_column}\tHighest accuracy: {highest_accuracy}")
30개의 컬럼을 가지고 있는 데이터라고 한다면 2개부터 20개까지 itertools를 이용해서
빠짐없이 모든 경우의 수를 확인하여 정확도가 가장 높은 결과를 보인 것을 보여준다.