본문 바로가기

인공지능/딥러닝

Chapter 3 핸즈온 머신러닝 연습문제 풀이

반응형

1. MNIST 데이터셋으로 분류기를 만들어 테스트 세트에서 97% 정확도를 달성해보세요. 힌트 : KNeighborsClassifier가 이 작업에 아주 잘 맞습니다. 좋은 하이퍼파라미터 값만 찾으면됩니다. ->(weights, n_neighbors 하이퍼파라미터로 그리드 탐색을 시도해보세요.)

# mnist 데이터 세트 불러오기
from sklearn.datasets import fetch_openml
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier

mnist = fetch_openml('mnist_784', version=1, as_frame=False)

X, y = mnist['data'], mnist['target']

print('X: 데이터 개수: ', X.shape)
print('y: 데이터 개수: ', y.shape)

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]


# KNN 분류기
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)

print(knn_clf.predict([some_digit]))
print(plt.imshow(some_digit.reshape(28,28)))

# cross_val

cross_val_score(knn_clf, X_test, y_test, cv=3, scoring='accuracy')

# 그리드 서치로 하이퍼파라미터 찾기
# grid searchcv!
from sklearn.model_selection import GridSearchCV


param_grid = [{
    'weights' : [1,2,3,4,5]},
{    'n_neighbors' :[1,2,3,4,5]}
]

grid_search_prep = GridSearchCV(knn_clf, param_grid, cv=5,
                                scoring='neg_mean_squared_error', verbose=2)
grid_search_prep.fit(X_train, y_train)

정확도를 97%로 맞춰야 한다. -> Grid SearchCv를 이용해서 적당한 하이퍼파라미터를 찾아주자.

- grid searchCv 결과

정확도가 향상되긴 했음.

Confusion Matrix (혼동 행렬 결과) -> 대각선이 아주 훌륭하다.

2. MNIST 이미지를 (왼, 오른, 위, 아래) 어느 방향으로든 한 픽셀 이동시킬 수 있는 함수를 만들어보세요. 그런 다음 훈련 세트에 있는 각 이미지에 대해 네 개의 이동된 복사본(방향마다 한 개씩)을 만들어 훈련 세트에 추가하세요. 마지막으로 이 확장된 데이터셋에서 앞에서 찾은 최선의 모델을 훈련시키고, 테스트 세트에서 정확도를 측정해보세요. 모델 성능이 더 높아졌는지 확인해보세요! 인위적으로 훈련 세트를 늘리는 이 기법을 데이터 증식 또는 훈련 세트 확장이라고 합니다.

  • 일단 데이터를 다운받기
from sklearn.datasets import fetch_openml

mnist= fetch_openml('mnist_784',as_frame=False , version=1)

X, y = mnist['data'], mnist['target']

x_train, x_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

plt.imshow(x_train[0].reshape(28,28), cmap='binary')
  • scipy.ndimage.interpolation import shift 함수를 이용해서 각 방향으로 1픽셀씩 움직여 기존 훈련 데이터에 추가한다.
  • # 데이터 세트 확장하기 from scipy.ndimage.interpolation import shift

각 방향마다 하나씩 이동하기

x_up_train = []
x_down_train = []
x_left_train = []
x_right_train = []

for i in range(len(x_train)):
x_up_train.append(shift(x_train[i].reshape(28, 28), [-1, 0], cval=0).reshape(-1)) # 위로 한 칸
x_down_train.append(shift(x_train[i].reshape(28,28), [1, 0], cval=0).reshape(-1)) # 아래로 한 칸
x_left_train.append(shift(x_train[i].reshape(28,28), [0, -1], cval=0).reshape(-1)) # 왼쪽으로 한 칸
x_right_train.append(shift(x_train[i].reshape(28,28), [0, 1], cval=0).reshape(-1)) # 오른쪽으로 한 칸

x_train = np.concatenate([x_train, x_up_train, x_down_train, x_left_train, x_right_train])
print(x_train.shape)

- x에 대한 데이터에 추가했으니, 타겟 데이터도 증강 시켜주자.
```python

y_train = np.concatenate([y_train,y_train,y_train,y_train,y_train,])
print(y_train.shape)
  • 그리고 나서 모델 만들고 훈련하면 끝!
# 모델 훈련
from sklearn.linear_model import SGDClassifier

sgd_clf = SGDClassifier()
sgd_clf.fit(x_train, y_train)
sgd_clf.predict([some_digit])
  • 정확도 향상을 위한 데이터 스케일링 및 교차검증
# 데이터 스케일링 후, 교차 검증
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(x_train.astype(np.float64))
cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring="accuracy")

3. 타이타닉 데이터셋에 도전해보세요. 캐글에서 시작하면 좋습니다. (https://www.kaggle.com/c/titanic)

train.head()
# Pclass - Ticket Class
# fare - Passenger fare?
# cabin - cabin number 
# parch  - have children ? 
# sibSp - have 배우자?
# 승선 입구 번호
## 어떤 그룹의 사람들이 생존확률이 더 높은지? 
  • 나이와 생존확률? -> 나이에 대해 데이터를 시각화
import matplotlib.pyplot as plt

plt.hist(data['Age'])
print(data.shape)
survive_person = data[data['Survived']==1]
print(survive_person.shape)
plt.hist(survive_person['Age'])

총 데이터 수
생존자 데이터 수

## 남녀 생존자 수 차이

 

man = data[data['Sex']== 'male']
women = data[data['Sex']=='female']

print(len(man), len(women))

survive_man = survive_person[survive_person['Sex'] =='male']
survive_women = survive_person[survive_person['Sex']=='female']
print(len(survive_man), len(survive_women))
반응형