Skip to content

Instantly share code, notes, and snippets.

@kanjirz50
Created October 15, 2019 07:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kanjirz50/ce2cc8345d93b0d2d6f1500db6eda758 to your computer and use it in GitHub Desktop.
Save kanjirz50/ce2cc8345d93b0d2d6f1500db6eda758 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# AdaBoostの実装"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用ライブラリのインポート"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:34:32.349088Z",
"start_time": "2019-10-11T09:34:32.083605Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"import math\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn import datasets\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## アルゴリズム評価用のシンプルな決定木"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T08:43:58.741173Z",
"start_time": "2019-10-11T08:43:58.737446Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"# アルゴリズム評価に使用する最もシンプルな構造をした決定木(深さ1, ノードが1つと葉が2つ)\n",
"class DecisionStump:\n",
" def __init__(self):\n",
" # {-1, 1}の分類\n",
" self.polarity = 1\n",
" # 何番目の素性に対する決定木かを保持\n",
" self.feature_index = None\n",
" # 素性に対する閾値\n",
" self.threshold = None\n",
" # 分類器の重み(確からしさ、貢献度)\n",
" self.alpha = None"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## AdaBoostアルゴリズム"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:25:17.824414Z",
"start_time": "2019-10-11T09:25:17.719349Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"class AdaBoost:\n",
" def __init__(self, n_clf=5):\n",
" # 弱学習器の数\n",
" self.n_clf = n_clf\n",
" # 学習器\n",
" self.clfs = []\n",
"\n",
" def fit(self, X, y):\n",
" n_samples, n_features = np.shape(X)\n",
" # 重みの初期化\n",
" weights = np.full(n_samples, (1 / n_samples))\n",
" \n",
" self.clfs = []\n",
" for _ in range(self.n_clf):\n",
" # 弱学習器にはシンプルな決定木を利用\n",
" clf = DecisionStump()\n",
" # 無限大をエラーの初期値とする\n",
" min_error = float(\"inf\")\n",
"\n",
" # 良い感じのスレッショルドを探す\n",
" for feature_i in range(n_features):\n",
" # 対象とする素性のうち値はユニーク(素性値に対するスレッショルドであるため) \n",
" feature_values = np.expand_dims(X[:, feature_i], axis=1)\n",
" unique_values = np.unique(feature_values)\n",
"\n",
" for threshold in unique_values:\n",
" p = 1\n",
" # 1としてデフォルト推定値をセット\n",
" prediction = np.ones(np.shape(y))\n",
" # スレッショルドより小さいと-1を設定\n",
" prediction[X[:, feature_i] < threshold] = -1\n",
" # 誤りの数\n",
" error = sum(weights[y != prediction])\n",
" \n",
" # 半分以上間違っているときは、polarityを逆にする(error = 0.8なら逆にするとerror = 0.2のはず)\n",
" if error > 0.5:\n",
" error = 1 - error\n",
" p = -1\n",
"\n",
" # より小さいエラーのパラメータを保存する\n",
" if error < min_error:\n",
" clf.polarity = p\n",
" clf.threshold = threshold\n",
" clf.feature_index = feature_i\n",
" min_error = error\n",
" # この分類器の確からしさを計算\n",
" clf.alpha = 0.5 * math.log((1.0 - min_error) / (min_error + 1e-10))\n",
" \n",
" predictions = np.ones(np.shape(y))\n",
" # 分類器のスレッショルドより下回る場合に、負例とする\n",
" negative_idx = (clf.polarity * X[:, clf.feature_index] < clf.polarity * clf.threshold)\n",
" predictions[negative_idx] = -1\n",
" # 重みの更新。間違ったサンプルはより大きな重みとなる\n",
" weights *= np.exp(-clf.alpha * y * predictions)\n",
" # 重みの正規化\n",
" weights /= np.sum(weights)\n",
"\n",
" self.clfs.append(clf)\n",
"\n",
" def predict(self, X):\n",
" n_samples, _ = np.shape(X)\n",
" y_pred = np.zeros((n_samples, 1))\n",
" for clf in self.clfs:\n",
" predictions = np.ones(np.shape(y_pred))\n",
" negative_idx = (clf.polarity * X[:, clf.feature_index] < clf.polarity * clf.threshold)\n",
" predictions[negative_idx] = -1\n",
" y_pred += clf.alpha * predictions\n",
" \n",
" # -1, 0, 1に書き換える(signum function)\n",
" y_pred = np.sign(y_pred).flatten()\n",
" return y_pred"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T10:03:34.787471Z",
"start_time": "2019-10-11T10:03:34.785445Z"
}
},
"source": [
"## 乳がんデータセットで評価"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:25:18.375776Z",
"start_time": "2019-10-11T09:25:18.363753Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"data = datasets.load_breast_cancer()\n",
"X = data.data\n",
"y = data.target\n",
"\n",
"# -1, 1のラベルに変更\n",
"y[y == 0] = -1\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:38:33.717179Z",
"start_time": "2019-10-11T09:38:30.914951Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.9590643274853801"
]
},
"execution_count": 135,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ada_boost = AdaBoost(n_clf=5)\n",
"ada_boost.fit(X_train, y_train)\n",
"pred = ada_boost.predict(X_test)\n",
"accuracy_score(y_test, pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1つめのシンプルな決定木での精度"
]
},
{
"cell_type": "code",
"execution_count": 117,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:31:09.962080Z",
"start_time": "2019-10-11T09:31:09.954934Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"0.8947368421052632"
]
},
"execution_count": 117,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictions = np.ones(np.shape(y_test))\n",
"\n",
"threshold_for_polarity = ada_boost.clfs[0].polarity * ada_boost.clfs[0].threshold\n",
"feature_polarity = ada_boost.clfs[0].polarity * X_test[:, ada_boost.clfs[0].feature_index]\n",
"negative_idx = (feature_polarity < threshold_for_polarity)\n",
"predictions[negative_idx] = -1\n",
"\n",
"accuracy_score(y_test, predictions)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:31:06.319374Z",
"start_time": "2019-10-11T09:31:06.315886Z"
}
},
"source": [
"## 弱学習器の数による精度の変化"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:37:19.830872Z",
"start_time": "2019-10-11T09:36:49.852409Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"scores = []\n",
"left = range(1, 11)\n",
"for i in left:\n",
" ada_boost = AdaBoost(n_clf=i)\n",
" ada_boost.fit(X_train, y_train)\n",
" pred = ada_boost.predict(X_test)\n",
" scores.append(accuracy_score(y_test, pred))"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {
"ExecuteTime": {
"end_time": "2019-10-11T09:38:00.863809Z",
"start_time": "2019-10-11T09:38:00.751491Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(left, scores)\n",
"plt.title(\"Increasing Number of Classifer\")\n",
"plt.xlabel(\"Number of Classifier\")\n",
"plt.ylabel(\"Accuracy\")\n",
"plt.grid(True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"toc_cell": false,
"toc_position": {},
"toc_section_display": "block",
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment