230417 / BSA05. 데이터 전처리 3 : 차원 축소

BSA05_Dim-Reduction.ipynb

 

필요한 패키지

# !pip install scikit-learn

import sklearn
# print(sklearn.__version__) : 0.23.0 이상인 버전 사용

from numpy import mean
from numpy import std
import statsmodels.api as sm

from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score  # 모형이 잘 적합했는지 점수로 확인
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.linear_model import LogisticRegression  # 예측력을 확인하기 위해서 (statsmodels는 개별적인 배타의 추정값들)
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.decomposition import TruncatedSVD
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.manifold import Isomap
from sklearn.manifold import LocallyLinearEmbedding

 

데이터 생성

설명변수, 반응변수 = make_classification(n_samples=1000, n_features=5, n_informative=5, n_redundant=0, random_state=0)
# n_redundant=0  : 설명변수들 간의 관련성 없음
# n_features=10, n_informative=5 : 설명력이 없는 5개의 변수를 빼고 분석
# n_redundant=4 : 4개의 변수는 다중공선성이 있는 변수
# n_features=20, n_informative=10, n_redundant=10 : 다중공선성이 있는 10개의 변수를 버리고 나머지 10개의 설명력이 있는 변수로 분석

# with statsmodels
설명변수 = sm.add_constant(설명변수)  # adding a constant (상수항 추가)
print(sm.Logit(반응변수,설명변수).fit().summary())  # 5개의 변수가 모두 유의함
# 표본크기=1000, 설명변수 개수=20, 설명력이 있는 변수=10, 불필요한 변수=10
설명변수, 반응변수 = make_classification(n_samples=1000, n_features=20, n_informative=5, n_redundant=10, random_state=0)
설명변수 = sm.add_constant(설명변수)  # adding a constant
print(sm.Logit(반응변수,설명변수).fit().summary())

 

차원축소한 자료에 대해 로지스틱 회귀분석

1. PCA(Principal Components Analysis)

# 모형설정
분석방법 = LogisticRegression()

# 원자료에 대한 평가 (10*3개의 평가자료)
## n_jobs=-1 : 모든 cpu를 사용하라는 의미
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
점수 = cross_val_score(분석방법, 설명변수, 반응변수, scoring='accuracy', cv=cv, n_jobs=-1)
print('Accuracy: %.3f (%.3f)'%(mean(점수), std(점수)))  # Accuracy: 0.902 (0.026)


# 설명력이 가장 큰 5개 변수 (X1, X2, ... ,X20에서 P1, P2, P3, P4, P5로 축소)
PCA(n_components=5).fit_transform(설명변수)


# ('pca', PCA(n_components=5)) : 차원축소, ('m', LogisticRegression()) : 분석방법
과정 = [('pca', PCA(n_components=5)), ('m', LogisticRegression())]
모형 = Pipeline(steps=과정)


# 설명변수를 principal component에 넣어서 나온 P를 로지스틱 회귀분석에 넣는 방법
점수 = cross_val_score(모형, 설명변수, 반응변수, scoring='accuracy', cv=cv, n_jobs=-1)
print('Accuracy: %.3f (%.3f)'%(mean(점수), std(점수)))  # Accuracy: 0.906 (0.028)
# 5개의 변수를 사용했지만 설명력은 거의 비슷함 (20개의 변수를 이용하는 것과 5개의 변수를 이용하는 것에 차이가 없다고 생각함;)

 

2. TruncatedSVD

TruncatedSVD(n_components=5).fit_transform(설명변수)

과정 = [('svd', TruncatedSVD(n_components=5)), ('m', LogisticRegression())]

모형 = Pipeline(steps=과정)
점수 = cross_val_score(모형, 설명변수, 반응변수, scoring='accuracy', cv=cv, n_jobs=-1)
print('Accuracy: %.3f (%.3f)'%(mean(점수), std(점수)))  # Accuracy: 0.906 (0.027)

 

3. LinearDiscriminantAnalysis

LinearDiscriminantAnalysis(n_components=1).fit_transform(설명변수, 반응변수)
# n_components <= min(n_classes-1, n_features)

과정 = [('Ida', LinearDiscriminantAnalysis(n_components=1)), ('m', LogisticRegression())]

모형 = Pipeline(steps=과정)
점수 = cross_val_score(모형, 설명변수, 반응변수, scoring='accuracy', cv=cv, n_jobs=-1)
print('Accuracy: %.3f (%.3f)'%(mean(점수), std(점수)))  # Accuracy: 0.904 (0.027)

 

4. Isomap

Isomap(n_components=5).fit_transform(설명변수)

과정 = [('iso', Isomap(n_components=5)), ('m', LogisticRegression())]

모형 = Pipeline(steps=과정)
점수 = cross_val_score(모형, 설명변수, 반응변수, scoring='accuracy', cv=cv, n_jobs=-1)
print('Accuracy: %.3f (%.3f)'%(mean(점수), std(점수)))  # Accuracy: 0.928 (0.023)
설명축소 = Isomap(n_components=5).fit_transform(설명변수)
설명축소 = sm.add_constant(설명축소)  # adding a constant
print(sm.Logit(반응변수, 설명축소).fit().summary())

 

5. LocallyLinearEmbedding

LocallyLinearEmbedding(n_components=5).fit_transform(설명변수)

과정 = [('lle', LocallyLinearEmbedding(n_components=5)), ('m', LogisticRegression())]

모형 = Pipeline(steps=과정)
점수 = cross_val_score(모형, 설명변수, 반응변수, scoring='accuracy', cv=cv, n_jobs=-1)
print('Accuracy: %.3f (%.3f)'%(mean(점수), std(점수)))  # Accuracy: 0.875 (0.030)