diff --git a/02_end_to_end_machine_learning_project.ipynb b/02_end_to_end_machine_learning_project.ipynb index 30a053b0d..08656e708 100644 --- a/02_end_to_end_machine_learning_project.ipynb +++ b/02_end_to_end_machine_learning_project.ipynb @@ -83,6 +83,13 @@ "# 데이터 가져오기" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 데이터 다운로드하기" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -129,6 +136,13 @@ " return pd.read_csv(csv_path)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 데이터 구조 훑어 보기" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -533,6 +547,13 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 테스트 세트 만들기" + ] + }, { "cell_type": "code", "execution_count": 10, @@ -1285,6 +1306,13 @@ "housing = strat_train_set.copy()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 지리적 데이터 시각화" + ] + }, { "cell_type": "code", "execution_count": 33, @@ -1469,6 +1497,13 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 상관관계 조사" + ] + }, { "cell_type": "code", "execution_count": 38, @@ -1584,6 +1619,13 @@ "save_fig(\"income_vs_house_value_scatterplot\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 특성 조합으로 실험" + ] + }, { "cell_type": "code", "execution_count": 42, @@ -1885,6 +1927,24 @@ "housing_labels = strat_train_set[\"median_house_value\"].copy()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 데이터 정제\n", + "\n", + "책에 소개된 세 개의 옵션은 다음과 같습니다:\n", + "\n", + "```\n", + "housing.dropna(subset=[\"total_bedrooms\"]) # 옵션 1\n", + "housing.drop(\"total_bedrooms\", axis=1) # 옵션 2\n", + "median = housing[\"total_bedrooms\"].median() # 옵션 3\n", + "housing[\"total_bedrooms\"].fillna(median, inplace=True)\n", + "```\n", + "\n", + "각 옵션을 설명하기 위해 주택 데이터셋의 복사본을 만듭니다. 이 때 적어도 하나의 열이 비어 있는 행만 고릅니다. 이렇게 하면 각 옵션의 정확한 동작을 눈으로 쉽게 확인할 수 있습니다." + ] + }, { "cell_type": "code", "execution_count": 47, @@ -2716,6 +2776,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## 텍스트와 범주형 특성 다루기\n", + "\n", "이제 범주형 입력 특성인 `ocean_proximity`을 전처리합니다:" ] }, @@ -2989,6 +3051,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## 나만의 변환기\n", + "\n", "추가 특성을 위해 사용자 정의 변환기를 만들어보죠:" ] }, @@ -3201,6 +3265,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## 변환 파이프라인\n", + "\n", "수치형 특성을 전처리하기 위해 파이프라인을 만듭니다:" ] }, @@ -3460,6 +3526,13 @@ "# 모델 선택과 훈련" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 훈련 세트에서 훈련하고 평가하기" + ] + }, { "cell_type": "code", "execution_count": 82, @@ -3674,7 +3747,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 모델 세부 튜닝" + "## 교차 검증을 사용한 평가" ] }, { @@ -3875,27 +3948,25 @@ "svm_rmse" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 모델 세부 튜닝" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 그리드 탐색" + ] + }, { "cell_type": "code", "execution_count": 98, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "GridSearchCV(cv=5, estimator=RandomForestRegressor(random_state=42),\n", - " param_grid=[{'max_features': [2, 4, 6, 8],\n", - " 'n_estimators': [3, 10, 30]},\n", - " {'bootstrap': [False], 'max_features': [2, 3, 4],\n", - " 'n_estimators': [3, 10]}],\n", - " return_train_score=True, scoring='neg_mean_squared_error')" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from sklearn.model_selection import GridSearchCV\n", "\n", @@ -4624,6 +4695,13 @@ "pd.DataFrame(grid_search.cv_results_)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 랜덤 탐색" + ] + }, { "cell_type": "code", "execution_count": 103, @@ -4686,6 +4764,13 @@ " print(np.sqrt(-mean_score), params)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 최상의 모델과 오차 분석" + ] + }, { "cell_type": "code", "execution_count": 105, @@ -4713,7 +4798,9 @@ { "cell_type": "code", "execution_count": 106, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -4750,6 +4837,13 @@ "sorted(zip(feature_importances, attributes), reverse=True)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 테스트 세트로 시스템 평가하기" + ] + }, { "cell_type": "code", "execution_count": 107, @@ -6532,7 +6626,7 @@ ], "metadata": { "kernelspec": { - "display_name": "TensorFlow 2.4 on Python 3.8 & CUDA 11.1", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -6546,7 +6640,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.7" + "version": "3.7.3" }, "nav_menu": { "height": "279px", diff --git a/03_classification.ipynb b/03_classification.ipynb index 523f92ba8..d8ab40fce 100644 --- a/03_classification.ipynb +++ b/03_classification.ipynb @@ -337,7 +337,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 이진 분류기" + "# 이진 분류기 훈련" ] }, { @@ -421,6 +421,20 @@ "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 성능 측정" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 교차 검증을 사용한 정확도 측정" + ] + }, { "cell_type": "code", "execution_count": 18, @@ -504,6 +518,13 @@ "* 마지막으로, 여러 세션에 결쳐 순서가 보장되지 않는 파이썬 딕셔너리(dict)이나 셋(set) 같은 것은 완벽한 재현성이 불가능합니다. 또한 디렉토리 안에 있는 파일의 순서도 보장되지 않습니다." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 오차 행렬" + ] + }, { "cell_type": "code", "execution_count": 21, @@ -560,6 +581,13 @@ "confusion_matrix(y_train_5, y_train_perfect_predictions)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 정밀도와 재현율" + ] + }, { "cell_type": "code", "execution_count": 24, @@ -685,6 +713,13 @@ "cm[1, 1] / (cm[1, 1] + (cm[1, 0] + cm[0, 1]) / 2)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 정밀도/재현율 트레이드오프" + ] + }, { "cell_type": "code", "execution_count": 30, @@ -974,7 +1009,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ROC 곡선" + "## ROC 곡선" ] }, { @@ -4528,7 +4563,7 @@ ], "metadata": { "kernelspec": { - "display_name": "TensorFlow 2.4 on Python 3.8 & CUDA 11.1", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -4542,7 +4577,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.7" + "version": "3.7.3" }, "nav_menu": {}, "toc": { diff --git a/04_training_linear_models.ipynb b/04_training_linear_models.ipynb index 89713b3d1..039efcea8 100644 --- a/04_training_linear_models.ipynb +++ b/04_training_linear_models.ipynb @@ -86,7 +86,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 정규 방정식을 사용한 선형 회귀" + "# 선형 회귀" ] }, { @@ -388,7 +388,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 배치 경사 하강법을 사용한 선형 회귀" + "# 경사 하강법\n", + "## 배치 경사 하강법" ] }, { @@ -537,7 +538,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 확률적 경사 하강법" + "## 확률적 경사 하강법" ] }, { @@ -677,7 +678,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 미니배치 경사 하강법" + "## 미니배치 경사 하강법" ] }, { @@ -1002,6 +1003,13 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 학습 곡선" + ] + }, { "cell_type": "code", "execution_count": 35, @@ -1104,7 +1112,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 규제가 있는 모델" + "# 규제가 있는 선형 모델" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 릿지 회귀" ] }, { @@ -1273,10 +1288,19 @@ "$" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 라쏘 회귀" + ] + }, { "cell_type": "code", "execution_count": 43, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stderr", @@ -1343,6 +1367,13 @@ "lasso_reg.predict([[1.5]])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 엘라스틱넷" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1377,6 +1408,13 @@ "elastic_net.predict([[1.5]])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 조기 종료" + ] + }, { "cell_type": "code", "execution_count": 46, @@ -1391,13 +1429,6 @@ "X_train, X_val, y_train, y_val = train_test_split(X[:50], y[:50].ravel(), test_size=0.5, random_state=10)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "조기 종료 예제:" - ] - }, { "cell_type": "code", "execution_count": 47, @@ -1647,6 +1678,13 @@ "# 로지스틱 회귀" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 결정 경계" + ] + }, { "cell_type": "code", "execution_count": 53, @@ -2001,6 +2039,13 @@ "log_reg.predict([[1.7], [1.5]])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 소프트맥스 회귀" + ] + }, { "cell_type": "code", "execution_count": 62, @@ -2855,7 +2900,7 @@ ], "metadata": { "kernelspec": { - "display_name": "TensorFlow 2.4 on Python 3.8 & CUDA 11.1", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -2869,7 +2914,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.7" + "version": "3.7.3" }, "nav_menu": {}, "toc": {