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))
'인공지능 > 딥러닝' 카테고리의 다른 글
핸즈온 머신러닝 챕터 4장 연습문제 풀이 (0) | 2024.03.25 |
---|---|
핸즈온 머신러닝 Chapter4. 모델 학습 학습 정리 (0) | 2024.03.10 |
Chapter2. 핸드온 머시러닝 연습문제 답 (0) | 2024.01.09 |
핸즈온 머신러닝 1장 연습문제 풀이! (1) | 2024.01.07 |
신경망 공부 - 트랜스포머? (2) | 2023.12.02 |