Skip to content

Instantly share code, notes, and snippets.

@yumatsuoka
Created December 22, 2016 15:14
Show Gist options
  • Save yumatsuoka/fa9acb03d137508c34f03e91e2e1e48f to your computer and use it in GitHub Desktop.
Save yumatsuoka/fa9acb03d137508c34f03e91e2e1e48f to your computer and use it in GitHub Desktop.
PCA + SVM with GridSearch using Scikit-learn
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# (2クラス問題)PCA+SVMのパラメータをGridSearchで探す"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# -*-coding:utf-8-*-\n",
"# pca+svm with grid search by yuma\n",
"\n",
"from __future__ import print_function\n",
"\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from sklearn.datasets import fetch_mldata\n",
"from sklearn.decomposition import PCA\n",
"from sklearn import svm\n",
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.metrics import classification_report, accuracy_score, confusion_matrix, roc_curve, auc"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 作図用の関数"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def show_cf(confusions, n_labels):\n",
" plt.clf()\n",
" plt.xlabel('Actual')\n",
" plt.ylabel('Predicted')\n",
" plt.grid(False)\n",
" plt.xticks(np.arange(n_labels))\n",
" plt.yticks(np.arange(n_labels))\n",
" plt.imshow(confusions, cmap=plt.cm.jet, interpolation='nearest');\n",
"\n",
" plt.xlim([-0.5, 1.5])\n",
" plt.ylim([1.5, -0.5])\n",
"\n",
" for i, cas in enumerate(confusions):\n",
" for j, count in enumerate(cas):\n",
" if count > 0:\n",
" xoff = .07 * len(str(count))\n",
" plt.text(j-xoff, i+.2, int(count), fontsize=32, color='white')\n",
" return 0\n",
"\n",
"def show_roc(test_labels, test_pred):\n",
" false_positive_rate, true_positive_rate, thresholds = roc_curve(test_labels, test_pred)\n",
" roc_auc = auc(false_positive_rate, true_positive_rate)\n",
" plt.clf()\n",
" plt.figure()\n",
" lw = 2\n",
" plt.plot(false_positive_rate, true_positive_rate, color='darkorange',\n",
" lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)\n",
" plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
" plt.xlim([0.0, 1.0])\n",
" plt.ylim([0.0, 1.05])\n",
" plt.xlabel('False Positive Rate')\n",
" plt.ylabel('True Positive Rate')\n",
" plt.title('MNIST label=0 and 1')\n",
" plt.legend(loc=\"lower right\")\n",
" plt.show()\n",
" return 0\n",
" \n",
"def show_scatter(data, target, d_name='hoge', n_plot=None):\n",
" plt.clf()\n",
" c = ['#ff0000','#0000ff','#d16b16','#00984b','#0074bf',\n",
" '#c30068','#6d1782', '#546474', '#244765', '#8f253b']\n",
" c_markers = ['s', 'v', 'o', 'd', '*', '+', 'H', 'p', 'x', 'D']\n",
" for i in range(len(list(set(target)))):\n",
" feat = data[np.where(target == i)]\n",
" if n_plot != None:\n",
" feat = feat[:n_plot]\n",
" plt.plot(feat[:, 0], feat[:, 1], c_markers[i], markeredgecolor=c[i], markerfacecolor='#ffffff', markeredgewidth=2, markersize=10)\n",
" plt.legend(['0', '1','2','3','4','5','6','7','8','9'], numpoints=1, borderaxespad=0, bbox_to_anchor=(1.17, 1))\n",
" plt.subplots_adjust(left=0.1, right=0.85)\n",
" plt.savefig('{}_vector.png'.format(d_name))\n",
" return 0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## データセットの取得とPCA適用の関数"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"\"\"\"\n",
"def get_dataset(n_labels=10):\n",
" dataset = fetch_mldata('MNIST original')\n",
" n_train = 60000\n",
" train_dataset = {'data': dataset['data'][:n_train] /255.,\n",
" 'target': dataset['target'][:n_train]}\n",
" test_dataset = {'data': dataset['data'][n_train:] /255.,\n",
" 'target': dataset['target'][n_train:]}\n",
" if n_labels != 10:\n",
" rdm = np.random.permutation(10)[:n_labels]\n",
" # flatten()したい多次元numpy.ndarrayが1次元に変形できず,動かない\n",
" train_indexes = np.asarray([np.where(train_dataset['target'] == i)[0] for i in rdm]).flatten()\n",
" test_indexes = np.asarray([np.where(test_dataset['target'] == i)[0] for i in rdm]).flatten()\n",
" train_dataset = {'data': train_dataset['data'][train_indexes],\n",
" 'target': train_dataset['target'][train_indexes]}\n",
" test_dataset = {'data': test_dataset['data'][test_indexes],\n",
" 'target': test_dataset['target'][test_indexes]}\n",
" return train_dataset, test_dataset\n",
"\"\"\"\n",
"\n",
"def get_dataset(n_labels=None):\n",
" # 上の関数が動かないのでこちらで代用\n",
" dataset = fetch_mldata('MNIST original')\n",
" dataset['data'] = dataset['data'].reshape((len(dataset['data']), dataset['data'][0].size))\n",
" n_train = 60000\n",
" train_dataset = {'data': dataset['data'][:n_train] /255.,\n",
" 'target': dataset['target'][:n_train]}\n",
" test_dataset = {'data': dataset['data'][n_train:] /255.,\n",
" 'target': dataset['target'][n_train:]}\n",
" \n",
" # 0, 1の2クラス分のデータのみ取り出している\n",
" train_indexes = np.where(train_dataset['target'] < 2)[0]\n",
" test_indexes = np.where(test_dataset['target'] < 2)[0]\n",
" train_dataset = {'data': train_dataset['data'][train_indexes],\n",
" 'target': train_dataset['target'][train_indexes]}\n",
" test_dataset = {'data': test_dataset['data'][test_indexes],\n",
" 'target': test_dataset['target'][test_indexes]}\n",
" return train_dataset, test_dataset\n",
"\n",
"def app_pca(dataset, data_dim=2):\n",
" #data = dataset['data'].reshape((len(dataset['data']), dataset['data'][0].size))\n",
" data = dataset['data']\n",
" pca = PCA(n_components = data_dim)\n",
" app_pca = pca.fit(data).transform(data)\n",
" app_dataset = {'data': app_pca, 'target': dataset['target']}\n",
" return app_dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## SVMを実行する関数\n",
"### http://may46onez.hatenablog.com/entry/2016/02/19/152532"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def svm_gds(train_d, test_d, parameters = {'kernel':('rbf', ), 'C':[1,], 'gamma':[0.1,]}):\n",
" clf = GridSearchCV(svm.SVC(), parameters, n_jobs = -1)\n",
" clf.fit(train_d['data'], train_d['target'])\n",
"\n",
" print(clf.best_estimator_)\n",
" test_pred = clf.predict(test_d['data'])\n",
" return test_pred\n",
"\n",
"def svm_param(train_d, test_d, parameters={'kernel':'rbf', 'C':1, 'gamma':0.1}):\n",
" clf = svm.SVC(kernel=parameters['kernel'], C=parameters['C'], gamma=parameters['gamma'])\n",
" clf.fit(train_d['data'], train_d['target'])\n",
" test_pred = clf.predict(test_d['data'])\n",
" return test_pred"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ハイパーパラメータ"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"data_dim = 2\n",
"n_labels = 2 # dummy\n",
"use_gds = False\n",
"pca = False\n",
"\n",
"parameters = {'kernel':('rbf', ), 'C':[0.001, 0.1, 1, 5, 10, 100], 'gamma':[0.001, 0.1, 1, 5, 10, 100]}\\\n",
" if use_gds == True else {'kernel':'rbf', 'C':5, 'gamma':0.001}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 処理を実行してみる"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"datasetの読み込み\n",
"train.shape, test.shape 12665 2115\n",
"train_dataset.shape:(12665, 784), test:(2115, 784)\n"
]
}
],
"source": [
"print(\"datasetの読み込み\")\n",
"train_dataset, test_dataset = get_dataset(n_labels=n_labels)\n",
"print(\"train.shape, test.shape\", len(train_dataset['target']), len(test_dataset['target']))\n",
"if pca == True:\n",
" train_dataset = app_pca(train_dataset, data_dim)\n",
" test_dataset = app_pca(test_dataset, data_dim)\n",
"print('train_dataset.shape:{}, test:{}'.format(train_dataset['data'].shape, test_dataset['data'].shape))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## PCAで次元圧縮したデータ空間を可視化してみる"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"if data_dim < 4 and pca == True:\n",
" show_scatter(train_dataset['data'], train_dataset['target'], n_plot=100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## SVMを実行"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"app_svm = (svm_gds)if(use_gds == True)else(svm_param)\n",
"test_pred = app_svm(train_dataset, test_dataset, parameters)\n",
"test_labels = test_dataset['target']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 評価してみる"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" 0.0 1.00 1.00 1.00 980\n",
" 1.0 1.00 1.00 1.00 1135\n",
"\n",
"avg / total 1.00 1.00 1.00 2115\n",
"\n"
]
}
],
"source": [
"print(classification_report(test_labels, test_pred))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.999527186761\n"
]
}
],
"source": [
"print(accuracy_score(test_labels, test_pred))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1fbb8c6dc18>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cfmx = confusion_matrix(test_labels, test_pred)\n",
"show_cf(cfmx, n_labels)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.figure.Figure at 0x1fbb8c6da58>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1fbb9cf1f98>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"show_roc(test_labels, test_pred)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment