Building Machine Learning System with Python ch.2.1
아이리스 데이터셋을 이용해 분류 작업을 한다.
흠.. 근데 뭔가 공부한 것들을 다시하는 느낌이라 복습한다고 생각해야겠다.
여기서 느낀 것은 시각화를 데이터 분석 초기에 하는 것이라는 것이다.
알고리즘만 공부할 때는 마지막에 시각화해서 보여주는 코드로 공부해서 그런지
시각화가 초기에 쓰면 좋은 점들을 생각 못했다.
초기에 데이터들에 대한 간략한 정보들을 쉽게 알 수 있는 것이 시각화인 것 같다.
아이리스 데이터셋
아이리스 데이터셋은 4가지 속성과 150가지의 예제를 가지고 있다.
1. 꽃받침 길이
2. 꽃받침 너비
3. 꽃잎 길이
4. 꽃잎 너비
이 데이터셋에는 4개의 속성이 있고 각 꽃은 종이 표기되어 있다.
여기서 우리가 하고 싶은 것은
"들판에서 새로운 꽃을 보면 기존의 데이터로 이 꽃을 예측할 수 있을까?"
첫번째 시각화
시각화는 초반에도 얘기했지만 분석의 초기 탐험 단계에 탁월하다.
from matplotlib import pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
data = load_iris()
features = data.data
feature_names = data.feature_names
target = data.target
target_names = data.target_names
for t in range(3):
if t == 0:
c = 'r'
marker = '>'
elif t == 1:
c='g'
marker = 'o'
elif t == 2:
c = 'b'
marker = 'x'
plt.scatter(features[target == t,0],features[target==t,1],marker = marker, c=c)
plt.xlabel("꽃받침 길이(cm)")
plt.ylabel("꽃받침 너비(cm)")
plt.show()
필요한 라이브러리들을 불러들이고
데이터를 불러들이고 변수에 설정해놓는다.
그리고 반복문을 통해 산점도를 그리고 반복문을 나와 그래프를 출력한다.
c 는 색이고 marker 은 점의 형태를 가리키는 옵션이다.
첫번째 분류 모델 만들기
약간의 코드를 작성해 구별점을 찾아야 한다.
labels = target_names[target]
plength = features[:, 2]
is_setosa = (labels == 'setosa')
max_setosa =plength[is_setosa].max()
min_non_setosa = plength[~is_setosa].min()
print('Maximum of setosa: {0}.'.format(max_setosa))
-> Maximum of setosa : 1.9
print('Minimum of others: {0}.'.format(min_non_setosa))
-> Maximum of others : 3.0
위와 같은 코드를 통해 꽃잎 길이가 2보다 작으면 아이리스 세토사이며, 그렇지 않으면 아이리스 버지니카나 버시컬러다.
지금 위 코드는 기계학습을 적용하지 않았다.
단지 구별점인 2를 찾아 분류한 것 뿐이다.
구별점을 자동으로 찾도록 코드를 작성하는 것이 기계학습이다.
다른 두 종과 세토사를 구별하는 것은 최소값과 최댓값으로 쉽게 찾을 수 있었으나
버지니카와 버시컬러를 구별하는 최적 경계값을 구하는 것은 쉽지 않다.
features = features[~is_setosa]
labels = labels[~is_setosa]
is_virginica = (labels == 'virginica')
is_setosa는 불리언 배열을 사용한다.
is_virginica 또한 불리언 배열을 사용한다.
best_acc = -1.0
for fi in range(features.shape[1]):
# 모든 경계 값에 대해 테스트
thresh = features[:,fi]
for t in thresh:
# 속성 `fi`에 대한 벡터를 구한다
feature_i = features[:, fi]
# 경계 값 `t`를 적용한다
pred = (feature_i > t)
acc = (pred == is_virginica).mean()
rev_acc = (pred == ~is_virginica).mean()
if rev_acc > acc:
reverse = True
acc = rev_acc
else:
reverse = False
if acc > best_acc:
best_acc = acc
best_fi = fi
best_t = t
best_reverse = reverse
labels = target_names[target]
plength = features[:, 2]
is_setosa = (labels == 'setosa')
max_setosa =plength[is_setosa].max()
min_non_setosa = plength[~is_setosa].min()
print('Maximum of setosa: {0}.'.format(max_setosa))
-> Maximum of setosa : 1.9
print('Minimum of others: {0}.'.format(min_non_setosa))
-> Maximum of others : 3.0
위와 같은 코드를 통해 꽃잎 길이가 2보다 작으면 아이리스 세토사이며, 그렇지 않으면 아이리스 버지니카나 버시컬러다.
지금 위 코드는 기계학습을 적용하지 않았다.
단지 구별점인 2를 찾아 분류한 것 뿐이다.
구별점을 자동으로 찾도록 코드를 작성하는 것이 기계학습이다.
다른 두 종과 세토사를 구별하는 것은 최소값과 최댓값으로 쉽게 찾을 수 있었으나
버지니카와 버시컬러를 구별하는 최적 경계값을 구하는 것은 쉽지 않다.
features = features[~is_setosa]
labels = labels[~is_setosa]
is_virginica = (labels == 'virginica')
is_setosa는 불리언 배열을 사용한다.
is_virginica 또한 불리언 배열을 사용한다.
best_acc = -1.0
for fi in range(features.shape[1]):
# 모든 경계 값에 대해 테스트
thresh = features[:,fi]
for t in thresh:
# 속성 `fi`에 대한 벡터를 구한다
feature_i = features[:, fi]
# 경계 값 `t`를 적용한다
pred = (feature_i > t)
acc = (pred == is_virginica).mean()
rev_acc = (pred == ~is_virginica).mean()
if rev_acc > acc:
reverse = True
acc = rev_acc
else:
reverse = False
if acc > best_acc:
best_acc = acc
best_fi = fi
best_t = t
best_reverse = reverse
print(best_fi, best_t, best_reverse, best_acc)
위 코드를 통해 정확도와 베스트 모델링을 가능케 하는 속성을 알 수 있다.
전체 데이터를 위 코드로 돌리면 베스트 모델은 꽃잎 너비로 구분하는 것이다.
아직 제대로 된 기계학습을 적용하지 않고 그냥 코드로 분석한 정도이다.
댓글
댓글 쓰기