본문 바로가기
프로그램/SKT FLY AI

SKT FLY AI : 5일차 - ML

by hsloth 2023. 6. 30.

SKT FLY AI 합숙 마지막 날 아침에 들은 강의이다.

머신러닝 데이터 전처리

데이터 전처리

  • 레이블 인코딩
  • 원핫 인코딩

레이블 인코딩


from sklearn.preprocessing import LabelEncoder

items = ["tv", "냉장고", "컴퓨터", "전자레인지", "믹서", "선풍기", "믹서"]

encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items) # tv는 0, 냉장고는 1, 컴퓨터는 5처럼 하나의 짝을 지어 반환
print(labels)    # [0 1 5 4 2 3 2]
print(encoder.classes_)    #['tv', '냉장고', '믹서', '선풍기', '전자레인지', '컴퓨터']
print(encoder.inverse_transform([4,5,3,2,4,2,0,1,1]))    # ['전자레인지' '컴퓨터' '선풍기' '믹서' '전자레인지' '믹서' 'tv' '냉장고' '냉장고']

원핫인코딩

  • 하나만 1로 남기고 나머진 0으로 변경
  • get_dummies()
items = df = pd.DataFrame({'items': items})
print(df)
print(pd.get_dummies(df))

SVM


데이터 스케일링

  • 데이터 전처리
  • Feature마다 데이터 값의 범위가 다르기 때문에 범위 차이가 클 경우, 데이터를 갖고 모델링 할 때, 0으로 수렴하거나 무한으로 발산
  • 모든 피처들의 데이터 분포나 범위를 동일하게 조정
  • StandardScaler()
    • 평균이 0이고, 분산이 1인 정규 분포로 만드는 것
    • 표준편차란 평균으로부터 얼마나 떨어져있는지 구한 것
  • MinMaxScaler()
    • 최대값은 1 최소값은 0으로 최소-최대 정구화
    • 이상치에 취악
  • MaxAbsScaler()
    • 모든 피처들의 절댓값이 0과 1사이에 놓이도록 만들어줌.
    • 즉 0을 기준으로 절댓값이 가장 큰 수가 1 또는 -1의 값을 가짐
    • 이상치에 취약
  • RobustScaler()
    • 중간값(median)과 사분위값(quartile)을 사용
    • 이상치 영향 최소화
    • 표준화 후 데이터가 더 넓게 분포
  • Normalizer()
    • 열을 대상으로 함
    • 한 행의 모든 피처들 사이의 유클리드 거리가 1이 되도록 데이터값 생성
    • 좀 더 빠르게 학습할 수 있고 과대적합 확률을 낮출 수 있다.

Confusion matrix


데이터 스케일링

  • 혼돈 매트릭스 또는 오차 행렬

  • 정확도(accuracy)

  • 정밀도(precision)

  • 재현율 (recall)

  • F1 Score

  • ROC, AUC

예측값

  • accuracy : 전체 경우 중 맞은 경우에 대한 확률 (TN+TP)/(전체)
  • precision : 맞다고 예측한 애들 중 실제로 맞은 것의 비율. TP/(FP+TP)
  • recall : 실제로 맞은 사람들 중에 맞았다고 예측한 애들의 비율. TP/(FN+TP)
  • F1 Score : 정밀도(precision)와 재현율(recall)의 조화평균. 2 / [(1/recall) + (1/precision)]
  • ROC, AUC : 맞출 때마다 TPR(수직) 방향으로 한 칸씩 올라가고, 틀리면 FPR(수평) 방향으로 이동

### accuracy
from sklearn.metrics import accuracy_score
accuracy_score(정답, 예측)

### precision
from sklearn.metrics import precision_score
precision_score(정답, 예측)

### recall
from sklearn.metrics import recall_score
recall_score(정답, 예측)

### f1 score
from sklearn.metrics import f1_score
f1_score(정답, 예측)

### ROC, AUC
from sklearn.metrics import roc_auc_score
roc_auc_socre(정답, 예측

실습



from sklearn import svm, datasets
cancer = datasets.load_breast_cancer()
cancer.keys()

import pandas as pd
dfX = pd.DataFrame(cancer.data, columns=cancer.feature_names)
dfy = pd.DataFrame(cancer.target, columns=['target'])
print('features : ', dfX.shape)
print('label : ', dfy.shape)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(dfX, dfy,
                                          test_size=0.2, 
                                          random_state=42)
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
y_train = y_train.values
X_train[:3, :]  

X_test = sc.transform(X_test)
y_test = y_test.values


from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

y_pred = knn.predict(X_test)
y_pred

# 혼동행렬 계산 (평가 지표)
from sklearn.metrics import confusion_matrix
cf = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 6))
s = sns.heatmap(cf, annot=True, fmt='d', cmap="Blues", cbar=False)
s.set(xlabel='Prediction', ylabel='Actual')
plt.show()

from sklearn.metrics import accuracy_score

acc = accuracy_score(y_test, y_pred)
print("acc : ", acc)

결정트리(Decision tree)

  • 의사 결정 규칙을 나무 구조로 나타내어 전 체자료를 몇 개의 작은 집단으로 나누어서 분석하는 기법
  • SVM처럼 결정트리는 분류 및 회귀가 가능한 머신러닝 알고리즘
  • 매우 복잡한 데이터셋도 학습할 수 있는 강력한 알고리즘
  • 최근 많이 사용하는 랜덤 포레스트의 기본 구성요소
    • Root Node : 깊이가 0인 꼭대기 노드
    • Leaf Node : 자식 노드가 없는 마지막 노드
    • Gini Impurity : 한 노드의 모든 샘플이 같은 클래스에 속해있으면, 해당 노드는 순수(gini=0)
  • 결정트리의 장점 : 스케일이나 평균을 원점에 맞추는 것과 같은 데이터 전처리가 거의 필요하지 않음.
  • 사이킷런 : 이진트리만 만드는 CART 알고리즘을 사용
  • 결정트리 " 위와 같이 매우 직관적이고 이해하기 쉽고, 해석력이 아주 좋다. ('white box')

규제 매개변수

  • 결정 트리의 경우 훈련 데이터에 대한 가정을 보통 두지 않음(선형모델은 데이터가 선형일거라 가정)
  • 훈련 데이터에 대한 일반적인 가정을 두지 않는다면, 모델 자체가 훈련 데이터와 아주 가깝게 만들려고해서 과적합이 발생할 수 있음
  • 결정 트리 모델은 경우에는 일반적인 선형 모델과 다르게 파라미터 모델이 아니다.
  • 결정 트리 모델은 훈련되기 전에 파라미터의 수를 지정할 수 없는 비파라미터 모델
  • 비파라미터 모델은 훈련 데이터에 맞춰지기 때문에 모델 구조가 고정되지 않고 자유롭다.
  • 파라미터 모델은 미리 파라미터를 정할 수 있기 때문에 제한적이지만, 과적합의 위험을 조절할 수 있음
  • 결정 트리는 보통 최대 깊이(max_depth)로 모델의 과적합을 규제할 수 있음.
  • max_depth가 낮아지면 과적합의 위험이 감소

결정트리의 규제 매개변수 종류

  • max_dept : 트리 최대 깊이
    • max_depth감소 -> 모델 규제 증가 -> 과적합 감소
  • min_samples_split : 분할되기 위해 노드가 가져야 하난 최소 샘플 수
    • min_samples_split 증가 -> 모델 규제 증가 -> 과적합 감소
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets

df = sns.load_dataset('penguins')
df.head()

print(df.shape)

df.info()

df.isnull().sum(axis=0)

df=df.dropna()
df.isnull().sum(axis=0)

df['species']=df['species'].map({'Adelie':0, 'Chinstrap':1, 'Gentoo':2})
df['island']=df['island'].map({'Biscoe':0, 'Dream':1, 'Torgersen':2})
df['sex']=df['sex'].map({'Female':0, 'Male':1})

X = df.drop(['species'], axis=1)
y = df['species']

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                            test_size=0.2, random_state=42)

print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.tree import DecisionTreeClassifier

dtc = DecisionTreeClassifier()
dtc.fit(X_train,y_train)

plt.figure(figsize=(10,10))
plot_tree(dtc)
plt.show()

y_pred = dtc.predict(X_test)
y_pred

from sklearn.metrics import *
acc = accuracy_score(y_test, y_pred)
print("정확도 : ", acc)

dtc = DecisionTreeClassifier(max_depth=3)
dtc.fit(X_train, y_train)
plt.figure(figsize=(10,10))
plot_tree(dtc)
plt.show()

y_pred = dtc.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print("정확도 : ", acc)