본문 바로가기
AI/머신러닝

03. SVM, accuracy_score | 아이리스

by 사라리24 2024. 6. 10.
SMALL

 

1. 아이리스 데이터셋 

- 데이터셋:특정한 작업을 위해 데이터를 관련성 있게 모아놓은 것
- 아이리스 데이터셋 :
머신러닝에서 분류 알고리즘을 학습하고 평가하는 데 자주 사용되는 예제 데이터셋

 

 

  • 아이리스 데이터 찾기

 

 

  • 아이리스 데이터 import
    : scikit-learn 라이브러리에서 load_iris 함수를 불러오기
  
 
      from sklearn.datasets import load_iris
 
  

 

 

  • load_iris 함수를 사용하여 아이리스 붓꽃 데이터셋을 로드한 후, 이를 iris 변수에 저장
 
 
        iris = load_iris() # 아이리스 붓꽃 데이터
        iris
 
 






  • data: 입력 변수(특징)들의 2D 배열 (numpy 배열). 각 행은 하나의 샘플, 각 열은 하나의 특징을 나타냅니다.
  • target: 타겟 변수(레이블)들의 1D 배열. 각 값은 샘플의 클래스 레이블을 나타냅니다.
  • feature_names: 입력 변수들의 이름을 담은 리스트.
  • target_names: 타겟 변수의 클래스 이름을 담은 리스트.
  • DESCR: 데이터셋에 대한 설명을 담은 문자열.
  • filename: 데이터셋 파일의 경로.

 

  • iris 객체'DESCR' 속성을 출력
    : 데이터셋에 대한 설명을 담고 있는 문자열
  
 
          print(iris['DESCR'])
 
  


⏺️ 아이리스 종류(타겟이름)

  • Iris-Setosa: 세토사
  • Iris-Versicolour: 버시컬러
  • Iris-Virginica: 버지니카


⏺️ 분류 속성(입력변수)

  • sepal length in cm: 꽃받침의 길이
  • sepal width in cm: 꽃받침의 넓이
  • petal length in cm: 꽃잎 길이
  • petal width in cm: 꽃잎 넓이

 

 

  • 샘플데이터 결과보기
 
 
          data = iris['data'] # 샘플데이터, Numpy 배열로 이루어져 있음
          data # 결과 보기
 
 





 

 

  • 'feature_names' 키를 사용하여 입력 변수(특징)들의 이름을 가져와
     feature_names 변수에 저장
  
 
          feature_names = iris['feature_names'] # Feauture 데이터의 이름
          feature_names
  
 

 

 

  • 판다스로 시각화하기
 

          import pandas as pd

 
        df_iris = pd.DataFrame(data,columns = feature_names)
        df_iris
 
  

 

  • iris 객체에서 타겟 변수(레이블) 데이터를 추출하여
    target 변수에 저장
  
 
        target = iris['target'] # Label데이터, Numpy 배열로 이루어져 있음
        target # 결과보기
 
 
        target.shape
 
 

각 샘플에 대한 클래스 레이블을 나타내는 배열
: 클래스 0 (setosa),
: 클래스 1 (versicolor),
: 클래스 2 (virginica)

target 배열

: 150개의 요소로 구성 (1차원 배열)

 

 

  • 파생변수로 만들기
 
 
        df_iris['target'] = target
        df_iris
 
 

 

 

2.  데이터 나누기 

  훈련 세트 / 테스트 세트

 

  • train_test_split 함수 가져오기
  
          from sklearn.model_selection import train_test_split
 
  • scikit-learn 라이브러리model_selection 모듈에서 train_test_split 함수를 가져옵니다.
  • train_test_split 함수데이터를 무작위로 섞은 후 지정된 비율에 따라 훈련 세트테스트 세트로 나누어 줍니다.
# 일반적으로 데이터 세트를 훈련세트와 테스트세트로 분리하여 모델의 성능을 평가하고 검증하기 위해 사용됨

 

 

 

  • df_iris 데이터프레임 - 입력 변수(X)타겟 변수(y)를 나누기
  
       
        X_train,X_test,y_train,y_test = train_test_split(df_iris.drop('target',1),df_iris['target'],test_size= 0.2, random_state=2024)
 
  
@ train_test_split함수
      (독립변수,종속변수,테스트사이즈, 시드값....)
      입력 변수(X)와 타겟 변수(y)훈련 세트와 테스트 세트로 나누는 코드


  • df_iris.drop('target', 1)
          'target' 열을 제외한 나머지 열들을 선택 - 입력 변수(X)

  • df_iris['target'] 
          'target' 열을 선택 - 타겟 변수(y)

  • test_size=0.2    
          테스트 세트의 비율을 20%로 설정
          즉, 전체 데이터 중 20%를 테스트 세트로 사용

  • random_state=2024
    데이터를 분할할 때 사용되는 랜덤 시드(seed)를 설정
    시드를 설정하면 데이터를 동일한 방식으로 무작위로 섞을 수 있음


[결과]

<ipython-input-14-983b661006cd>:2: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.
  X_train,X_test,y_train,y_test = train_test_split(df_iris.drop('target',1),df_iris['target'],test_size= 0.2, random_state=2024)

 

  • 테스트, 정답 데이터 차원보기
 
 
        X_train.shape, X_test.shape
 
        y_train.shape, y_test.shape
 
  

   X_train = 훈련세트의 독립변수 행 : 120 /  열 : 4
   X_test = 테스트세트의 독립변수 행 : 30 /  열 : 4
   y_train = 훈련세트의 종속변수  120 요소(데이터 포인트)
   y_test = 테스트세트의 종속변수 30 요소(데이터 포인트)

 

 

  • 테스트, 정답 데이터 확인
  
 
          X_train
  
          y_train
 
 

X_train: 훈련 세트의 입력 변수입니다. 이 변수는 모델의 학습에 사용될 데이터를 포함합니다.
y_train: 훈련 세트의 타겟 변수입니다. 이 변수는 모델이 예측해야 할 실제 값(레이블)을 포함합니다.

 

 

3. 정확도 계산

  SVM은 지도 학습 알고리즘 중 하나로, 주어진 데이터를 분류하거나 회귀하는 데 사용
  accuracy_score분류 모델의 성능을 측정하는 지표 중 하나로, 예측값과 실제값이 얼마나 일치하는지를 나타냅니다.

 

  • scikit-learn 라이브러리
    서포트 벡터 머신(Support Vector Machine, SVM) 모델 가져오기
    metrics 모듈에서 정확도를 계산하기 위한 accuracy_score 함수를 가져오기
 
 
        from sklearn.svm import SVC  # 지도학습
        from sklearn.metrics import accuracy_score # 정확도 계산 
 
 

 

 

  • SVM 모델 생성, 
    모델을 훈련 세트로 학습
  
 
        svc=SVC()
        svc.fit(X_train, y_train )
 
 

 

  • predict 메서드 : 데이터에 대한 예측값을 계산
 
 
          # svc.predict()메서드는 주어진 데이터에 대한 예측값을 반환함
          y_pred = svc.predict(X_test)
          y_pred
 
  


array([0, 0, 1, 1, 0, 1, 1, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 2, 2, 1, 0, 2, 1, 0, 2, 0])

0, 1, 2는 아이리스 데이터셋에서 각각 다음을 의미합니다:

  • 0: Setosa
  • 1: Versicolor
  • 2: Virginica

    즉, 예측값으로 나타난 0은 Setosa 품종을, 1은 Versicolor 품종을, 2는 Virginica 품종을 의미합니다.
    이 값들은 모델이 해당 꽃의 품종을 예측한 결과를 나타냅니다.
  • svcSVM 모델 객체를 나타냅니다.
  • predict 메서드를 사용하여 테스트 세트인 X_test에 대한 예측값을 계산합니다.
  • 계산된 예측값은 y_pred 변수에 저장됩니다.

 

  • 실제값과 예측값을 비교하여 정확도를 계산
  
 
          print('정답률:',accuracy_score(y_test,y_pred))
 
 
정답률: 0.8666666666666667
  • accuracy_score 함수는 scikit-learn 라이브러리에서 제공되는 함수로,
    실제값(y_test)과 예측값(y_pred)을 인자로 받아서 정확도를 계산합니다.
  • 정확도는 모델이 예측한 값들 중에서 실제값과 일치하는 비율을 나타냅니다.
  • 예측값과 실제값이 완전히 일치할 때 정확도는 1이 되고, 완전히 다를 때는 0이 됩니다.

 

 

  • 2023으로 바꾼 경우
 

          X_train, X_test, y_train, y_test = train_test_split(df_iris.drop('target', axis=1), df_iris['target'], test_size=0.2, random_state=2023)

 
          y_pred = svc.predict(X_test)
          y_pred
 
          print('정답률:',accuracy_score(y_test,y_pred))
 
  
array([2, 1, 1, 2, 1, 2, 1, 1, 0, 1, 0, 1, 0, 2, 0, 2, 0, 1, 0, 0, 1, 0, 2, 1, 0, 0, 0, 2, 1, 0])
정답률: 1.0

------------------------------------------------------------------------------------------------------
[ random_state=2023 ]

랜덤 시드를 2023로 변경하니 "정답률이 높아짐!"

 

 

  • 꽃씨 예측하기
  
 
          # 6.2 2.1 4.1 1.5
          y_pred = svc.predict([[ 6.2, 2.1, 4.1, 1.5]])
          y_pred
  
 


  • svc는 SVM 모델 객체를 나타냅니다.
  • predict 메서드를 사용하여 새로운 데이터에 대한 예측값을 계산합니다.
  • [[6.2, 2.1, 4.1, 1.5]]는 새로운 데이터를 나타내며,
    입력 변수의 값들을 리스트 형태로 전달합니다.
    이 데이터는 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비를 나타냅니다.
/usr/local/lib/python3.10/dist-packages/sklearn/base.py:439: UserWarning: X does not have valid feature names, but SVC was fitted with feature names warnings.warn(array([1])


1번 꽃씨로 예측함