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

08. 서포트 백터머신(Support Vector Machine) | 손글씨

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

1. 손글씨 데이터셋

  

 

  • scikit-learn 라이브러리에서 손글씨 숫자 데이터셋을 불러오기
  
 
    from sklearn.datasets import load_digits
 
 

 

  • digits 변수 load_digits() 함수의 결과를 할당
 
 
        digits = load_digits()
        digits
 
  

 

 

  • digits 데이터셋에서 사용 가능한 키(속성)들을 확인
    data.shape: data 배열의 형태(shape)를 확인
  
 
        digits.keys()
 
        data = digits['data']
        data.shape
 
 

 

 

  • digits 데이터셋에서 'target' 키에 해당하는 값을 가져와 target 변수에 할당
    * 'target'은 이미지에 대한 실제 숫자 값(레이블)을 포함하는 배열
 
 
        target = digits['target']
        target.shape
 
        target
 
  

 

 

  • 2x5 격자 모양의 서브플롯을 생성
    각 숫자 이미지를 하나의 서브플롯에 표시
  
 
        import matplotlib.pyplot as plt

        fig, axes = plt.subplots(2, 5, figsize=(14, 8))
        for i, ax in enumerate(axes.flatten()):
            ax.imshow(data[i].reshape((8, 8)), cmap='gray')
            ax.set_title(target[i])
           
        # ax.imshow(data[i].reshape((8, 8)) : data[i]를 8x8 행렬로 변형
        # cmap='gray' : 흑백 이미지로 표시
        # cmap='gray' : 매개변수는 흑백 색상 맵을 사용하도록 지정
        # ax.set_title(target[i]) :각 이미지의 제목을 target[i]로 설정
 
  

 

 

  • 2x5 격자 모양의 서브플롯을 생성, 생성된 그림과 서브플롯들을 출력하는 코드
 
  
        fig,axes = plt.subplots (2,5,figsize=(14,8))
        print(fig)
 
        print(axes)
 
  


 

 

2.  스케일링(Scaling)

* 데이터를 특정한 스케일로 통일하는 것
* 다차원의 값들을 비교 분석하기 쉽게 만들어주며, 
   자료의 오버플로우나 언더플로우를 방지하여 최적화 과정에서의 안정성 및 수렴 속도를 향상
* 데이터를 모델링하기 전에 거치는 것이 좋음

 

1. 스케일링의 종류 
* StandardScaler : 평균과 표준편차를 사용
* MinMaxScaler : 최대, 최솟값이 각각 1과 0 이 되도록 스케일링
* RobustScaler : 중앙값과 IQR사용(아웃라이어의 영향을 최소화)

 

  • 영화의 평점을 나타내는 딕셔너리
    딕셔너리 키: 'naver', 'netflix'(리스트로 표현)
  
 
        import pandas as pd
 
        movie = {
            'naver': [2, 4, 6, 8, 10],
            'netflix': [1, 2, 3, 4, 5]
        }
  
        movie = pd.DataFrame(movie)
        movie
 
 

 

 

  • 영화 평점 데이터를 Min-Max 스케일링을 사용하여 정규화
 

      from  sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler

      min_max_scaler = MinMaxScaler()
 
      min_max_scaler = min_max_scaler.fit_transform(movie)
      min_max_scaler
 
      pd.DataFrame(min_max_scaler, columns=['naver','netflix'])
 
  
  • from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler:
    scikit-learn 라이브러리에서 StandardScaler, MinMaxScaler, RobustScaler를 가져오기
  • min_max_scaler = MinMaxScaler()
    MinMaxScaler 객체를 생성
    최소-최대 스케일링을 수행할 준비가 된 상태
  • min_max_scaler = min_max_scaler.fit_transform(movie)
    movie 데이터프레임에 최소-최대 스케일링을 적용
    fit_transform() 메서드는 데이터를 변환하면서 스케일링을 수행
    이후 min_max_scaler 변수에 변환된 데이터가 저장
  • min_max_scaler
    최소-최대 스케일링이 적용된 데이터를 출력
  • pd.DataFrame(min_max_scaler, columns=['naver','netflix'])
    변환된 데이터를 데이터프레임으로 변환하여 출력
    이 때, 열의 이름을 'naver'와 'netflix'로 지정


 

2. 정규화(Normalization)
* 값의 범위(Scale)을 0~1사이의 값으로 바꿔주는 것
* 학습 전에 Scaling을 하는 것
* 머신러닝, 딥러닝에서 Scale이 큰 Feature의 영향이 비대해지는 것을 방지
* scikit-learn에서 MinMaxScaler 사용

 

 

  • digits 데이터셋에서 첫 번째 이미지 데이터 출력
  
       data[0]
  
 

 

 

  • 최소-최대 스케일링(Min-Max Scaling)하여 정규화
        
 
        from sklearn.preprocessing import MinMaxScaler

        scaler = MinMaxScaler()
        scaled= scaler.fit_transform(data)
        scaled[0]
 
 
  • from sklearn.preprocessing import MinMaxScaler
    scikit-learn 라이브러리에서 MinMaxScaler를 가져오기 
    최소-최대 스케일링을 수행하기 위한 클래스
  • scaler = MinMaxScaler()
    MinMaxScaler 객체를 생성
    최소-최대 스케일링을 수행할 준비가 된 상태
  • scaled = scaler.fit_transform(data)
    data에 최소-최대 스케일링을 적용
    fit_transform() 메서드는 데이터를 변환하면서 스케일링을 수행
    이후 scaled 변수에 변환된 데이터가 저장
  • scaled[0]
    변환된 데이터 중 첫 번째 데이터를 출력
    이는 최소-최대 스케일링이 적용된 후의 첫 번째 데이터



 

3. 표준화(Standardization)
* 값의 범위(Scale)를 평균 0, 분산 1이 되도록 바꿔주는 것
* 학습 전에 Scaling 하는 것
* 머신러닝, 딥러닝에서 Scale이 큰 Feature의 영향이 비대해지는 것을 방지
* 정규분포를 표준정규분포로 변환하는 것과 같음
* scikit-learn에서 StandardScaler 사용




 

  • 데이터 나누기
 
 
        from sklearn.model_selection import train_test_split

        X_train,X_test,y_train,y_test = train_test_split(scaled, target,test_size =0.2, random_state=2024)
 
        X_train.shape,y_train.shape
        X_test.shape,y_test.shape
  
 

 

 

3. Support Vector Machine(SVM)

 *  두 클래스로부터 최대한 멀리 떨어져 있는 결정 경계를 찾는 분류기
 * 특정 조건을 만족하는 동시에 클래스를 분류하는 것을 목표로 함
 * 머신러닝 중 최대성능을 내는 모델

 

 

  • import
  
 
        from sklearn.svm import SVC
        from sklearn.metrics import accuracy_score
  
 

 

 

  • 객체생성 후 학습시키기
 
 
        model = SVC()
        model.fit(X_train,y_train)
 
 

 

 

  • 예측 결과의 정확도를 평가하기


        y_pred = model.predict(x_test)
 
 
        accuracy_score(y_test,y_pred)
 
 
        print ( y_test[0],y_pred[0])
  
 

  • y_pred = model.predict(x_test)
    * model:
     학습된 머신 러닝 모델
    * x_test: 테스트 데이터의 특성
    * predict() 메서드:
    - 주어진 특성에 대해 예측값을 반환,  x_test를 입력으로 받아 예측값을 계산
    - 이를 y_pred 변수에 저장
  • accuracy_score(y_test, y_pred)
    - y_test:
     테스트 데이터의 실제 레이블
    - y_pred: 해당 데이터에 대한 모델의 예측값
    - accuracy_score() 함수: 실제 레이블과 예측값을 비교하여 정확도를 계산
    따라서 이 코드는 모델의 예측값과 실제 레이블 간의 정확도를 계산
  • print(y_test[0], y_pred[0])
    - 테스트 데이터의 첫 번째 샘플에 대한 실제 레이블과 모델의 예측값을 출력
    - 이를 통해 모델의 예측이 실제와 얼마나 일치하는지를 확인할 수 있습니다.

 

 

  • 테스트 데이터의 첫 번째 샘플을 이미지로 시각화하여 출력
 
 
        plt.imshow(X_test[0].reshape(8,8), cmap='gray')
        plt.show()
 
  

 

 

  • 테스트 데이터의 처음부터 10개 샘플을 그래프로 나타내기
  
 
        import matplotlib.pyplot as plt
        fig,axes = plt.subplots(2,5, figsize = (14, 8))

        for i, ax in enumerate(axes.flatten()):
          ax.imshow(X_test[i].reshape(8,8), cmap='gray')
          ax.set_title(f'Label: {y_test[i]},PRed:{y_pred[i]}')
 
  
 

  • import matplotlib.pyplot as plt
    matplotlib 라이브러리에서 pyplot 모듈을 가져오기 이를 plt라는 별칭으로 사용
  • fig, axes = plt.subplots(2, 5, figsize=(14, 8))
    2x5 크기의 서브플롯을 생성합니다. 즉, 2행 5열의 그리드 형태로 서브플롯을 배치합니다.
    그리고 이를 fig와 axes에 할당합니다. figsize 매개변수는 전체 그림의 크기를 지정
  • for i, ax in enumerate(axes.flatten())
    axes를 flatten하여 1차원 배열로 변환하고, 이를 순회하면서 각각의 서브플롯에 대해 반복합니다.
    이때, 반복 변수 i는 인덱스이고, ax는 현재 서브플롯을 나타냅니다.
  • ax.imshow(X_test[i].reshape(8, 8), cmap='gray')
    현재 서브플롯에 X_test[i]를 8x8 크기의 이미지로 표시
    X_test[i]는 64개의 숫자로 이루어진 벡터
    .reshape(8, 8)를 통해 이미지로 변환
    cmap='gray'는 이미지를 그레이스케일로 표시하도록 지정
  • ax.set_title(f'Label: {y_test[i]},PRed:{y_pred[i]}')
    현재 서브플롯의 제목을 설정합니다.
    이때, 제목은 해당 이미지의 실제 레이블과 예측값을 나타내기
    f-string을 사용하여 변수의 값을 문자열에 삽입