선형판별분석(Linear Discriminant Analysis, LDA)
- LDA는 supervised learning에 속하는 알고리즘이며, projection시킨 데이터들에서 같은 클래스에 속하는 데이터들의 variance는 최대한 줄이고 (σwithinσwithin), 각 데이터들의 평균 값들의 variance는 최대한 키워서 (σbetweenσbetween) 클래스들끼리 최대한 멀리 떨어지게 만드는 것.
[이론 정리]
- 선형판별분석은 독립변수가 등간 또는 비율척도로만 구성되야 하는 제약사항을 가지고 있으며, 아래 기술하는 전제조건이 지켜졌을때 우수한 판별력을 보입니다.
- 전제조건 1 : 독립변수는 정규분포를 따라야 한다.
- 전제조건 2 : 종속변수와 독립변수는 상관관계를 가져야 한다.
- 전제조건 3 : 독립변수들 사이에 상관관계가 없거나 작아야 한다.
- 종속변수로 구분되는 각 집단 별 공분산 행렬이 유사해야 한다.(각 집단의 데이터퍼짐정도가 유사한 유형)
- 각 집단에 대해 판별식을 통해 표본데이터의 판별점수를 산출하고 판별점수에 따라 어느 집단에 포함될지 결졍함
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#iris 데이터셋 로드와 Dict 포맷의 키 확인하기
data = load_iris()
print("iris dataset format and keys\n",data.keys())
#feature name과 관측값 가져오기
iris_data = data['data']
iris_cols = data['feature_names']
print("iris dataset columns\n",iris_cols)
#column name을 재설정
iris_cols=['sep_len', 'sep_wt', 'pet_len', 'pet_wt']
#데이터프레임 생성하기 ==> 학습시키기 위한 데이터(독립변수들)
iris_df = pd.DataFrame(data= iris_data, columns= iris_cols)
print(iris_df.head(5))
#데이터프레임에 학습 데이터의 정답값(라벨) 데이터 추가(종속변수)
iris_df['label'] = data['target']
print(iris_df.head(5))
#종속변수 각 그룹에 대해 데이터 카운팅 해보기
check_df = iris_df.groupby(by='label').count()
print(check_df)
#LDA 수행
#LDA 패키지 import
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
#학습시키기 위한 독립변수와 종속변수 분할하기
X_train = iris_df[iris_cols]
y_train = iris_df['label']
#LDA 오브젝트생성 및 독립변수와 종속변수를 이용해 LDA 환경구성
lda = LDA().fit(X_train, y_train)
print("판별식 선형계수\n",lda.coef_)
print("판별식 상수\n",lda.intercept_)
y_pred = pd.DataFrame(lda.predict(X_train))
print("예측결과\n", y_pred.head(5))
y_pred_score = pd.DataFrame(lda.predict_proba(X_train))
print("예측스코어\n", y_pred_score.head(5))
print("예측정확도\n", lda.score(X_train,y_train))
# 분류 결과 확인하기
from sklearn.metrics import confusion_matrix
conf_df = pd.DataFrame(confusion_matrix(y_train, lda.predict(X_train)))
conf_df.columns=['pred 0', 'pred 1', 'pred 2']#setosa,versicolor,virginica
conf_df.index = ['real 0', 'real 1', 'real 2']
print('Confusion Matrix \n',conf_df)
#시각화로 확인해보기
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
cld=LinearDiscriminantAnalysis()
X_lda = cld.fit_transform(X_train, y_train)
print(X_lda.shape)
#데이터셋 시각화 해보기
fig, ax = plt.subplots(ncols=2)
sns.scatterplot(iris_df['sep_len'], iris_df['sep_wt'], hue=iris_df['label'], ax=ax[0])
sns.scatterplot(X_lda[:,0], X_lda[:,1], hue=y_train, ax=ax[1])
plt.show()
실행 결과
* 서버 문제가 있는지, 그래프 출력이 이뤄지지 않는다.
iris dataset format and keys
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
iris dataset columns
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
sep_len sep_wt pet_len pet_wt
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
sep_len sep_wt pet_len pet_wt label
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
sep_len sep_wt pet_len pet_wt
label
0 50 50 50 50
1 50 50 50 50
2 50 50 50 50
판별식 선형계수
[[ 6.31475846 12.13931718 -16.94642465 -20.77005459]
[ -1.53119919 -4.37604348 4.69566531 3.06258539]
[ -4.78355927 -7.7632737 12.25075935 17.7074692 ]]
판별식 상수
[-15.47783673 -2.02197415 -33.53768674]
예측결과
0
0 0
1 0
2 0
3 0
4 0
예측스코어
0 1 2
0 1.0 3.896358e-22 2.611168e-42
1 1.0 7.217970e-18 5.042143e-37
2 1.0 1.463849e-19 4.675932e-39
3 1.0 1.268536e-16 3.566610e-35
4 1.0 1.637387e-22 1.082605e-42
예측정확도
0.98
Confusion Matrix
pred 0 pred 1 pred 2
real 0 50 0 0
real 1 0 48 2
real 2 0 1 49
(150, 2)
'프로젝트 > 코드프레소 체험단' 카테고리의 다른 글
머신러닝을 위한 사이킷런 활용 팁 - 머신러닝 모델 선택 및 K-Fold 교차 검증 (0) | 2022.02.13 |
---|---|
파이썬으로 구현하는 머신러닝 - 완강 후기 (0) | 2022.02.13 |
파이썬으로 구현하는 머신러닝 : 비지도학습 - 선형판별분석(LDA)의 개념 (0) | 2022.02.12 |
파이썬으로 구현하는 머신러닝 : 비지도학습 - PCA 실습 (0) | 2022.02.12 |
파이썬으로 구현하는 머신러닝 : 비지도학습 - 주성분분석(PCA)의 개념 (0) | 2022.02.10 |