상관관계 확인

행동하는 개발자·2023년 7월 10일
0

PHM

목록 보기
39/43

데이터의 상관관계를 확인하는 코드는 다음과 같다.

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보다 큰 열이 많은 상황에 직면했을 때, 변수 간의 다중공선성이 높다는 것을 의미한다. 다중공선성은 불안정한 계수 추정 및 개별 변수가 대상 변수에 미치는 영향을 해석하는 일에서 문제를 일으킬 수 있다.

해결방법은 다음과 같다.

  1. 중복 변수 제거

  2. 기능 선택 기술: RFE, Lasso 정규화, pca 분석

  3. 정규화 기술: Ridge 회귀, Elastic Net

  4. 도메인 지식 활용

  5. 더 많은 데이터 수집

  6. 중복 변수를 제거하는 코드는 다음과 같다.

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를 이용해서
빠짐없이 모든 경우의 수를 확인하여 정확도가 가장 높은 결과를 보인 것을 보여준다.

profile
끊임없이 뭔가를 남기는 사람

0개의 댓글