파이썬으로 구현하는 머신러닝 : 비지도학습 - LDA 실습

2022. 2. 12. 16:34·프로젝트/코드프레소 체험단

선형판별분석(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
'프로젝트/코드프레소 체험단' 카테고리의 다른 글
  • 머신러닝을 위한 사이킷런 활용 팁 - 머신러닝 모델 선택 및 K-Fold 교차 검증
  • 파이썬으로 구현하는 머신러닝 - 완강 후기
  • 파이썬으로 구현하는 머신러닝 : 비지도학습 - 선형판별분석(LDA)의 개념
  • 파이썬으로 구현하는 머신러닝 : 비지도학습 - PCA 실습
KimCookieYa
KimCookieYa
무엇이 나를 살아있게 만드는가
  • KimCookieYa
    쿠키의 주저리
    KimCookieYa
  • 전체
    오늘
    어제
    • 분류 전체보기 (577) N
      • 혼잣말 (88)
      • TIL (3)
      • 커리어 (24)
        • Sendy (21)
        • 외부활동 기록 (2)
      • 프로젝트 (186)
        • 티스토리 API (5)
        • 코드프레소 체험단 (89)
        • Web3 (3)
        • Pint OS (16)
        • 나만무 (14)
        • 대회 (6)
        • 정글 FE 스터디 (16)
        • MailBadara (12)
        • github.io (1)
        • 인공지능 동아리, AID (5)
        • 졸업과제 (18)
        • OSSCA 2024 (1)
      • 크래프톤 정글 2기 (80)
      • IT (170) N
        • 코딩 (4)
        • CS (18)
        • 에러 (5)
        • 블록체인 (23)
        • Front-End (41) N
        • 알고리즘&자료구조 정리 (3)
        • 코딩테스트 (3)
        • BOJ 문제정리 (41)
        • WILT (12)
        • ML-Agents (4)
        • 강화학습 (1)
        • Android (0)
        • LLM (2)
      • 전공 (1)
        • 머신러닝 (1)
      • 자기계발 (20)
        • 빡공단X베어유 (2)
        • 독서 (15)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Velog
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    react
    Pint OS
    Flutter
    블록체인
    글리치해커톤
    코드프레소
    NEAR Protocol
    docker
    pintos
    OS
    JavaScript
    해커톤
    알고리즘
    핀토스
    센디
    졸업과제
    RNN
    나만무
    파이썬
    리액트
    사이드프로젝트
    딥러닝
    니어프로토콜
    크래프톤정글
    머신러닝
    자바스크립트
    부산대
    numpy
    MailBadara
    프로그래머스
  • hELLO· Designed By정상우.v4.10.3
KimCookieYa
파이썬으로 구현하는 머신러닝 : 비지도학습 - LDA 실습
상단으로

티스토리툴바