본문 바로가기
3.9 기타 개발/Python

[파이썬/코드] Scikit-learn 활용한 붓꽃 품종 예측하기

by Dohi._. 2023. 5. 20.
728x90

오늘 코드는 Iris라는 아주아주 유명해서 머신러닝계의 "hello word" 급이라는 붓꽃 품종 예측하기를 해보려고 합니다

 

Scikit-learn을 사용하기위해서는 설치를 해야합니다!

pip을 사용해서 설치를 진행합니다

pip install scikit-learn

 

sepal length, sepal , petal length, petal width를 통해서 품종을 예측해보자

 Iris의 데이터에는 꽃의 특성(독립변수)을 구분한 150개의 자료가 있다.

특징과 거기에 맞는 품종(종속변수)이 표시된 120개의 데이터를 이용하여 학습을 시킨 후  

나머지 30개의 특징들만으로 품종을 예측을 하려고 한다.

 

 

특징들(SL,SW,PL,PW) 품종
학습용 자료 (80%) 학습용 자료 (80%)
테스트 자료(20%) 검증용 자료(20%)

사실 테스트와 검증용의 차이는 없는데 일부러 차이를 뒀다 (둘다 검증용이라고 하는게 사실 맞다)

 

일단! iris의 데이터를 불러온후 특징과 품종을 나눕니다

iris = load_iris()
df=pd.DataFrame(iris.data,columns =['sepalL','spealW','petalL','petalW'])
#데이터 세트의 특성을 DataFrame으로 변환합니다. DataFrame은 pandas 라이브러리에서 제공하는 테이블 형식의 데이터 구조

#타겟열에 iris의 데이터를 넣습니다. (위에 타겟이 없어서 타켓을 추가적으로 넣어줌)
df['target']=iris.target
#타겟을 Y에 넣음 
Y=df.target
#타겟을 제외한 것을 X에 주입
X=df.drop(columns=['target'])

 

 

 

그 후 학습용 데이터와 테스트용 데이터를 분리해보자.

 

학습용 데이터와 테스트용 데이터를 분리하는 이유는 학습용 데이터로 학습된 모델이 어느정도의 성능을 가지는지 평가하려면 테스트용 데이터세트가 필요하기 때문이다 ( 학습된 데이터세트로 테스트를 진행하면 이미 답을 알고있는 경우이기 떄문에 100%의 정확률을 보일 것이다. 고로 이것은 테스트를 옮바르게 진행한 것이 아니다.) 

테스트용 데이터를 분리하기 위해서  sklearn(이후 사이킷런이라고도 부르겠다)에서 train_test_split()API를 제공한다.

train_test_split()을 이용하면 학습용 데이터와 테스트용 데이터를 test_size의 값의 비율로 나누는 것이 가능하다.
이번 포스팅에서는 test_size =0.2로 설정하는데 전체 데이터에서  테스트용 데이터가 20%로 나눠지고

나머지 학습데이터가 80%로 데이터를 분할한다.

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)
#train_test_split 함수는 다음과 같은 매개변수를 사용합니다.
#X: 특성 데이터 세트.
#y: 레이블 데이터 세트.
#test_size: 테스트 세트의 크기.

 

 

의사결정나무를 통해서 학습시키기

#지도학습
model=DecisionTreeClassifier()

#Kfold 아래코드느 5개로 쪼갬
kfold = KFold()

#교차검증
#train용 데이터를 넣고 (점수는 정확도로)
score= cross_val_score(model,X_train,Y_train,cv=kfold,scoring='accuracy')
#cross_val_score 함수는 다음과 같은 매개변수를 사용합니다.
#model: 모델.
#X: 특성 데이터 세트.
#y: 레이블 데이터 세트.
#cv: 교차 검증을 위해 데이터 세트를 분할하는 방법.
#scoring: 모델의 성능을 평가하는 방법.---scoring='accuracy' 매개변수를 사용하여 정확도를 계산합니다.


#print(score) 랜덤으로 돌려서 값이 다를수있다
#[0.95833333 0.95833333 0.875      0.95833333 1.        ]
#print(score.mean())


#학습완료 fit 메서드는 모델을 훈련하고 학습된 모델을 반환합니다.
model.fit(X_train,Y_train)

#X_test로 Y_test를 출력한게아닌 예상한 데이터를 ypred를 만듬 
ypred=model.predict(X_test)

#맞춘% (부울이라 맞 =1 틀렷을경우 =0)
print((ypred==Y_test).mean())
#하나하나 확인
print((ypred==Y_test))

교차검증 방법도 준비했는데요 그냥 참고로 아시면 좋을 것 같습니다!

 

 

[돌린결과값] 

0.9666666666666667
50      True
51      True
6       True
125     True
42      True
53      True
64      True
92      True
100     True
106    False
138     True
113     True
62      True
117     True
114     True
32      True
52      True
13      True
27      True
75      True
57      True
85      True
69      True
97      True
93      True
91      True
14      True
140     True
63      True
118     True

총 96%의 정확도를 보였네요!

 

제가 위에서 검증용과 테스트용을 잠깐 분리 했는데요 

사실 뜻도 같고 사용하는 분야도 같은데 분리한이유는

테스트데이터중 특징을 학습모델에 넣어 나온 값을 (ypred)

검증용 데이터(종속변수, 품종 , y_test)과 비교하여 정확성을 테스트 하는 방식이기 때문에

 

일부러 말이라도 다르게 표현 했습니다

 

마지막으로! 

전체코드

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

import pandas as pd



iris = load_iris()
df=pd.DataFrame(iris.data,columns =['sepalL','spealW','petalL','petalW'])
#데이터 세트의 특성을 DataFrame으로 변환합니다. DataFrame은 pandas 라이브러리에서 제공하는 테이블 형식의 데이터 구조

#타겟열에 iris의 데이터를 넣습니다. (위에 타겟이 없어서 타켓을 추가적으로 넣어줌)
df['target']=iris.target
#타겟을 Y에 넣음 
Y=df.target
#타겟을 제외한 것을 X에 주입
X=df.drop(columns=['target'])


X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)
#train_test_split 함수는 다음과 같은 매개변수를 사용합니다.
#X: 특성 데이터 세트.
#y: 레이블 데이터 세트.
#test_size: 테스트 세트의 크기.
#random_state: 난수 생성기의 시드.

#지도학습
model=DecisionTreeClassifier()

#SVC   그냥 준비함! 이런것도 있구나 생각해주세요:)
#model=SVC(C=10)
#C 매개변수는 규제 강도를 지정합니다.
#규제는 모델이 훈련 데이터에 과적합되는 것을 방지하는 데 도움이 되며
#C 매개변수는 모델이 얼마나 과적합될 수 있는지를 제어하는 데 사용됩니다.


#Kfold 아래코드느 5개로 쪼갬
kfold = KFold()

#교차검증
#train용 데이터를 넣고 (점수는 정확도로)
score= cross_val_score(model,X_train,Y_train,cv=kfold,scoring='accuracy')
#cross_val_score 함수는 다음과 같은 매개변수를 사용합니다.
#model: 모델.
#X: 특성 데이터 세트.
#y: 레이블 데이터 세트.
#cv: 교차 검증을 위해 데이터 세트를 분할하는 방법.
#scoring: 모델의 성능을 평가하는 방법.---scoring='accuracy' 매개변수를 사용하여 정확도를 계산합니다.



#학습완료 fit 메서드는 모델을 훈련하고 학습된 모델을 반환합니다.
model.fit(X_train,Y_train)

#X_test로 Y_test를 출력한게아닌 예상한 데이터를 ypred를 만듬 
ypred=model.predict(X_test)

#맞춘% (부울이라 맞 =1 틀렷을경우 =0)
print((ypred==Y_test).mean())
#하나하나 확인
print((ypred==Y_test))

 

:) 이렇게 마무리 하겠습니다!

728x90

댓글