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)
'Statistics > BSA' 카테고리의 다른 글
230424 / BSA08. matplotlib 한글 처리 (0) | 2023.05.03 |
---|---|
230419 / BSA05. Housing 데이터로 전처리, 회귀 모델 적용, 시각화 (0) | 2023.04.23 |
230417 / BSA05. 데이터 전처리 3 : 데이터 불균형, resampling (0) | 2023.04.23 |
230412 / BSA05. 데이터 전처리 2 : python, pyspark에서 데이터 결합 (0) | 2023.04.23 |
230412 / BSA05. 데이터 전처리 2 : pyspark에서 결측값 처리 (0) | 2023.04.14 |