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)
'프로그램 > SKT FLY AI' 카테고리의 다른 글
SKT FLY AI : 6일차 - ML(2) (0) | 2023.07.04 |
---|---|
SKT FLY AI - 번외. 첫날~워크샵 (0) | 2023.07.01 |
SKT FLY AI : 2일차 - 실습 (0) | 2023.06.27 |
SKT FLY AI : 2일차 - 끄적이는 글(2). 머신러닝(기계학습) (0) | 2023.06.27 |
SKT FLY AI : 2일차 - 끄적이는 글(1) - Crawling, Seaborn, folium (0) | 2023.06.27 |