본문 바로가기

Machine Learning_모델설계_Python

판별분석_5 LDA, QDA 실습

안녕하세요 배도리입니다. 이번 게시글은 iris 데이터를 활용해서 LDA랑 QDA를 실습해보겠습니다. 

 

 

바로 데이터 불러버리기

 
import seaborn as sns #seaborn을 불러오고 네임스페이스를 sns로 축약
iris = sns.load_dataset('iris')  #iris라는 변수명으로 Iris 데이터셋 download

X = iris.drop('species', axis=1) #'species'열을 drop하고 input X를 정의
y_ = iris['species']

# Iris 데이터셋의 목표 변수(target variable)인 'species'와 입력 특성(input features)를 분리하기 위함입니다.
# Iris 데이터셋에서 'species' 열은 붓꽃의 종(species)을 나타내며, 이를 예측하려는 목표 변수입니다

 

 

y data를 범주형으로 변환 하겠습니다. LabelEncoder를 sklearn.preprocessing에서 가져와서 classle이라는 변수에 할당합니다. LabelEncoder는 문자열 레이블을 정수로 변환하는 데 사용되는 도구입니다.

 
from sklearn.preprocessing import LabelEncoder
classle = LabelEncoder() #class label
y = classle.fit_transform(iris['species'].values) #species 열의 문자열을 범주형으로 변환
#y 변수는 classle.fit_transform() 함수를 사용하여 'species' 열의 값들을 정수로 변환합니다.
# 이 함수는 먼저 데이터에 대한 인코딩을 학습(fit)한 다음, 학습된 인코딩을 사용하여 실제 문자열 레이블을 정수로 변환(transform)합니다.

 

 

학습데이터와 테스트 데이터 분리합니다.

#전체 데이터를 학습과 테스트 데이터셋으로 분리
from sklearn.model_selection import train_test_split

#X(입력변수)와 y(종속변수)로 이루어진 데이터를 학습과 테스트 데이터넷으로 각각 70%, 30%의 비율로 나눔
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=1, stratify=y)

 

 

상위 5개씩 만 뽑아서 살펴볼까용 그리고 전체 y도 한번보겠습니다.

X.head()

 

y_.head()
 
0 setosa
1 setosa
2 setosa
3 setosa
4 setosa
Name: species, dtype: object

 

 

print(y)
 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

 

 

 

 

이제 iris 데이터에 LDA 훈련 갑니다.

 
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda=LinearDiscriminantAnalysis(store_covariance=True)
#lda=LinearDiscriminantAnalysis(n_components=2, store_covariance=True)
# 선형 판별 분석을 위해 LinearDiscriminantAnalysis 객체를 생성합니다. 여기서 store_covariance=True는 공분산 행렬을 저장하도록 지정합니다.
 
#(주석 처리된 줄은 n_components=2를 사용하여 LDA 변환의 최대 차원을 2로 설정하는 방법을 보여줍니다.)
 
lda.fit(X_train, y_train) # LDA 적합
#lda.fit(X_train, y_train)를 사용하여 학습 데이터를 기반으로 LDA 모델을 학습시킵니다.
 
 
y_train_pred=lda.predict(X_train)
y_test_pred=lda.predict(X_test)
#학습된 LDA 모델은 lda 객체에 저장됩니다. lda.fit(X_train, y_train)을 호출하면,
# 학습 데이터를 사용하여 모델 파라미터를 추정하고, 이 정보가 lda 객체 내부에 저장됩니다.
#lda 객체는 학습된 모델의 정보를 저장하고 있으므로, 이후에 predict, predict_proba 등의 메서드를 사용하여 새로운 데이터에 대한 예측을 수행할 수 있습니다

 

 

정확도 보겠습니다.

#Accuracy score
from sklearn.metrics import accuracy_score
print(accuracy_score(y_train,y_train_pred))  
print(accuracy_score(y_test,y_test_pred))  
 
0.9809523809523809
1.0

 

 

혼합행렬로 보겠습니다.

#분류 결과
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_test_pred))  #각 행은 setosa, versicolor, virginica
 
[[15 0 0]
[ 0 15 0]
[ 0 0 15]]

 

 

 

Linear Discriminant Analysis (LDA)를 사용하여 2차원 공간으로 축소하고, 결과를 시각화해보겠습니다.

 
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
cld=LinearDiscriminantAnalysis()
#먼저, LinearDiscriminantAnalysis 클래스를 사용하여 LDA 객체 cld를 생성합니다.
X_lda = cld.fit_transform(X_train, y_train)
# cld.fit_transform(X_train, y_train)을 사용하여 학습 데이터의 특성을 LDA를 사용하여 2차원으로 축소합니다. 축소된 특성은 X_lda에 저장됩니다.
# 이전 코드는 LDA 모델을 학습시키기만 했고, 현재 코드는 LDA 모델을 학습시키면서 동시에 학습 데이터를 축소된 특성 공간으로 변환합니다.
# 이렇게 하여 시각화를 위한 축소된 특성을 얻을 수 있습니다.
from matplotlib import pyplot as plt
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.scatter(X_lda[:,0],X_lda[:,1],c=y_train,cmap='rainbow',alpha=0.7,edgecolors='b')
#X_lda는 LDA를 사용하여 고차원 데이터를 저차원(이 경우에는 2차원)으로 변환한 결과입니다. X_lda[:, 0]는 첫 번째 축소된 차원의 좌표를 나타내는 배열이고,
# X_lda[:, 1]는 두 번째 축소된 차원의 좌표를 나타내는 배열입니다. 이 두 배열은 학습 데이터의 각 포인트에 대해 2차원 공간의 좌표를 제공합니다.