diff --git a/03_classification.ipynb b/03_classification.ipynb index 916d744..92eb851 100644 --- a/03_classification.ipynb +++ b/03_classification.ipynb @@ -2237,7 +2237,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "데이터를 적재합니다:" + "먼저 [캐글](https://www.kaggle.com)에 로그인 하고 [타이타닉 챌린지](https://www.kaggle.com/c/titanic)에서 `train.csv`와 `test.csv`를 다운로드합니다. 두 파일을 `datasets/titanic` 디렉토리에 저장하세요." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "그다음 데이터를 적재합니다:" ] }, { @@ -3082,11 +3089,11 @@ "# stackoverflow.com/questions/25239958 에서 착안했습니다\n", "class MostFrequentImputer(BaseEstimator, TransformerMixin):\n", " def fit(self, X, y=None):\n", - " self.most_frequent = pd.Series([X[c].value_counts().index[0] for c in X],\n", + " self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X],\n", " index=X.columns)\n", " return self\n", " def transform(self, X, y=None):\n", - " return X.fillna(self.most_frequent)" + " return X.fillna(self.most_frequent_)" ] }, { @@ -3109,6 +3116,37 @@ " ])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### future_encoders.py를 사용한 방법 ==========================\n", + "\n", + "주의: 번역서는 `CategoricalEncoder`를 사용하여 각 범주형 값을 원-핫 벡터로 변경합니다. `OneHotEncoder`를 사용하는 것이 더 낫습니다. 지금은 정수형 범주 입력만 다룰 수 있지만 사이킷런 0.20에서는 문자열 범주 입력도 다룰 수 있을 것입니다(PR #10521). 지금은 `future_encoders.py` 파일에서 임포트하지만 사이킷런 0.20 버전이 릴리스되면 `sklearn.preprocessing`에서 바로 임포팅할 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from future_encoders import OneHotEncoder\n", + "\n", + "cat_pipeline = Pipeline([\n", + " (\"select_cat\", DataFrameSelector([\"Pclass\", \"Sex\", \"Embarked\"])),\n", + " (\"imputer\", MostFrequentImputer()),\n", + " (\"cat_encoder\", OneHotEncoder(sparse=False)),\n", + " ])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ====================================================" + ] + }, { "cell_type": "code", "execution_count": 117, @@ -3795,7 +3833,9 @@ { "cell_type": "code", "execution_count": 138, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -4354,7 +4394,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이 행렬은 무엇을 의미하나요? 세 번째 행의 첫 번째 열의 92는 세 번째 이메일이 어휘 목록에 없는 단어를 92개 가지고 있다는 뜻입니다. 그 다음의 1은 어휘 목록에 있는 첫 번째 단어가 한 번 등장한다는 뜻이고 그 다음의 0은 한 번도 나타나지 않는다는 뜻입니다. 이 단어들이 무엇인지 확인하려면 어휘 목록을 보면 됩니다. 첫 번째 단어는 \"the\"이고 두 번째 단어는 \"of\"입니다." + "이 행렬은 무엇을 의미하나요? 세 번째 행의 첫 번째 열의 65는 세 번째 이메일이 어휘 목록에 없는 단어를 65개 가지고 있다는 뜻입니다. 그 다음의 0은 어휘 목록에 있는 첫 번째 단어가 한 번도 등장하지 않는다는 뜻이고 그 다음의 1은 한 번 나타난다는 뜻입니다. 이 단어들이 무엇인지 확인하려면 어휘 목록을 보면 됩니다. 첫 번째 단어는 \"the\"이고 두 번째 단어는 \"of\"입니다." ] }, { @@ -4450,7 +4490,7 @@ "from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import cross_val_score\n", "\n", - "log_clf = LogisticRegression()\n", + "log_clf = LogisticRegression(random_state=42)\n", "score = cross_val_score(log_clf, X_train_transformed, y_train, cv=3, verbose=3)\n", "score.mean()" ] @@ -4483,7 +4523,7 @@ "\n", "X_test_transformed = preprocess_pipeline.transform(X_test)\n", "\n", - "log_clf = LogisticRegression()\n", + "log_clf = LogisticRegression(random_state=42)\n", "log_clf.fit(X_train_transformed, y_train)\n", "\n", "y_pred = log_clf.predict(X_test_transformed)\n",