python環境の構築方法
python等でプロジェクトごとに環境構築する
prenvを用いた環境構築
prenv install
sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
pathの設定
export PYENV_ROOT=$HOME/.pyenv export PATH=$PYENV_ROOT/bin:$PATH eval "$(pyenv init -)"
pythonバージョン指定したインストール
pyenv install 3.6.1
で現在使っているバージョンとインストールされているバージョンを確認できる。
あとは、ローカルだったり、グローバルだったり、お好みにpythonのバージョンの設定を行うだけ。
今回は全てのディレクトリにおいて、2.7.9を使うようにします。
でOK。
pip install インストール先指定 方法
pip install --install-option="--install-scripts=/home/kobayashi/.prenv/versions/3.6.1/lib/python3.6/site-packages" keras
# pyenv-virtualenvのインストール。 $ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv # .xxxrcに初期設定を追記する # 何故evalを使っているのか、オプションの`-`ってなんだ、と疑問に思ったのでスタックオーバーフローで質問してみました。 # http://ja.stackoverflow.com/questions/32043/xxxenv-の初期化時のeval-xxxenv-init-の意味 vi ~/.bashrc eval "$(pyenv virtualenv-init -)" # pyenv virtualenv にPythonバージョンと仮想化環境を識別する任意の名称(tag)を指定します。 $ pyenv virtualenv <pyversion> <tag> # するとそれに対応するsite-packagesディレクトリが生成されます Requirement already satisfied: setuptools in /home/vagrant/.pyenv/versions/<pyversion>/envs/<tag>/lib/python<X.Y>/site-packages Requirement already satisfied: pip in /home/vagrant/.pyenv/versions/<pyversion>/envs/<tag>/lib/python<X.Y>/site-packages # 作成した仮想環境はversionsから確認できます。 $ pyenv versions system 3.5.3/envs/virtual-3.5.3 # << この二つは多分同じ virtual-3.5.3 # << # 作成したタグ名をactivateサブコマンドに指定すると、仮想環境が有効になります。 $ pyenv activate <tag> # こんな感じでシェルのプロンプトの左にタグ名が表示されるはず (<tag>)$ # 仮想環境を終了するにはdiactivateを実行します。 $ pyenv diactivate # 通常のpyenvと同様にディレクトリローカルのvirtualenvも作成できます。 # アプリケーション開発プロジェクトのルートディレクトリに対して、pyenv localを # 指定しておくとよいでしょう。 $ pyenv local <tag>
仮想環境有効
$ pyenv activate <tag>
DCGANで植物の葉画像を生成してみたon Keras
データセット
GitHub - spMohanty/PlantVillage-Dataset
参考
結果
step 100
step 29900
病害葉画像版
病名:ceder rust
step 29900
病名:scab
step 29900
考察
葉に見えないことはない。
しかし、病害ごとの画像は病害見えるのはかなり難しい。
・パラメータの設定の調整
・step数の増減
・データ数の増加
の検討が必要あるかも
sckit-learn データセットを使った機械学習 回帰編1
回帰問題とは
数値を予測する問題です.学習時に入力データと出力データの組み合わせから対応する規則を学び,未知の入力データに対しても適切な出力を生成できるようにするもの.
つまり,入力と出力の関係(関数)を推定し,近似する問題と言える.
線形回帰
直線的な関係を推定する回帰.
のような式に対し,を求める問題として定式化される.
非線形回帰
sckit-learn データセットを使った機械学習 metricsで評価編
正答率(Accuracy)
適合率(Precision)
再現率(Recall)
F値(F-measure)
混同行列(Confusion Matrix)
#metrics.accuracy_score(test_target, predicted) print('accuracy:/n', metrics.accuracy_score(expected, predicted)) #metrics.precision_score(test_target, predicted, pos_label=#) print('Precision:/n', metrics.precision_score(expected, predicted, pos_label=3)) [http://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html:title] print('F1:/n', metrics.f1_score(expected, predicted, pos_label=3)) [http://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html#sklearn.metrics.recall_score:title] print('Recall:/n', metrics.recall_score(expected, predicted, pos_label=3)) [http://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html:title] print('Confusion_matrix:/n', metrics.confusion_matrix(expected, predicted))
参照:
情報検索の評価についてメモ(適合率,再現率,F値)siguniang.wordpress.com
from sklearn.metrics import classification_report print classification_report(label_test, predict) precision recall f1-score support 0 1.00 0.98 0.99 47 1 0.91 0.85 0.88 47 2 1.00 0.98 0.99 45 3 0.94 1.00 0.97 46 4 0.98 0.98 0.98 49 5 0.90 0.98 0.94 54 6 0.93 0.95 0.94 39 7 1.00 0.98 0.99 41 8 0.85 0.90 0.88 39 9 0.97 0.86 0.91 43 avg / total 0.95 0.95 0.95 450
sckit-learn データセットを使った機械学習 分類編2 分類器を使った分類
用いる分類器の種類
・k近傍法
・サポートベクターマシン(線形)
・サポートベクターマシン(ガウシアンカーネル)
・決定木
・ランダムフォレスト
・AdaBoost
・ナイーブベイズ
・線形判別分析
・二次判別分析
サポートベクターマシン(Support Vector Machine:SVM)は2クラス分類識別器の一種ある。
その大きな特徴として次の三つがあげられる。
1.マージン最大化という方針で識別平面を決定するので高い汎化能力が期待できる。
2.学習がラグランジュ未定乗数法により二次計画問題に帰着され、局所最適解が必ず広域最適解となる。
3.識別対象の空間に対する事前知識を反映した特徴空間を定義することで、その特徴空間上で線形識別を行える。 さらにその特徴空間上での内積を表したカーネルと呼ばれる関数を定義することにより、明示的に特徴空間への 変換を示す必要がない。
from skleran import svm classifier = svm.SVC(C=1.0, gamma=0.001)
決定木
データを複数クラスに分類する教師あり学習の1つ.
樹木モデルと呼ばれる木構造を利用した分類アルゴリズムです.
樹木モデルは,分類を実現するための分岐処理の集まり.
決定木のメリットは,分類ルールを樹木モデルとして可視化できるため,分類結果の解釈が比較的容易である点です.
デメリットは,過学習してしまう場合がある.
また,扱うデータの特性によっては,樹木モデルを生成することが難しいケースがある.
import matplotlib.pyplot as plt import numpy as np from sklearn import datasets from sklearn import tree from sklearn import metrics #3 and 8 setting position flag_3_8 = (digits.target == 3) + (digits.target == 8) #get data of 3 and 8 #.target[]でラベル,.images[]で画像を取得 images = digits.images[flag_3_8] labels = digits.target[flag_3_8] #3と8の画像データを一次元化 images = images.reshape(images.shape[0], -1) #create cllasifier n_sample = len(flag_3_8[flag_3_8]) train_size = int(n_sample * 3 / 5) #分類器:決定木を生成 classifier = tree.DecisionTreeClassifier() #classifier.fit()で生成した分類器に学習データを与えて学習を実行 classifier.fit(images[:train_size], labels[:train_size]) #性能評価 #正解ラベルとしてテストデータのラベルを取り出している expected = labels[train_size:] #分類の実行(テストデータを与えて分類結果(予測したラベル)を取得している) predicted = classifier.predict(images[train_size:]) #accuracy_score()によって正答率を計算 print('accuracy:\n', metrics.accuracy_score(expected, predicted))
ランダムフォレスト
アンサンブル学習と呼ばれる学習法のひとつ.アンサンブル学習とは,いくつかの性能の低い分類器を組み合わせて,ひとつの性能の高い分類器を作る手法です.性能の低い分類器は決まったものがあるわけではなく,適宜選択の必要がある.
アンサンブル学習のイメージは,弱分類器の多数決.
下記の2つの生成方法に分けることができる.
バギング
学習データを抜けや重複を許して複数個のグループに分割し,学習データのグループごとに弱分類化を生成する手法です.分類時は,各弱分類器の出力した分類結果の多数決を取ります.
ブースティング
複数の弱分類器を用意し,重み付きの多数決で分類を実現する方法.その重みも学習によって決定します,難易度の高い学習データを正しく分類できる弱分類器の判別結果が重視されるように重みを更新していきます.
ランダムフォレストは,バギングに分類されるアルゴリズム.
学習データ全体の中から重複や欠落を許して複数個の学習データセットを抽出し,その一部の属性を使って決定木を生成します.
判別処理が高速で学習データのノイズにも強いというメリットがある.分類だけでなく回帰やクラスタリングにも使える.
ただし,学習データ数が少ない場合は過学習になる傾向がある.
ランダムフォレストは決定木を複数組み合わせて、各決定木の予測結果を多数決することによって結果を得る.
以下アルゴリズム
①ランダムにデータを抽出
②決定木を成長させる
③1,2ステップを指定回繰り返す
予測結果を多数決することによって分類閾値(ラベル)を決定
ランダムフォレストはパラメータが非常に簡単になるという利点があります.主要なパラメータはサンプリング数と決定木を成長させる際に使用する特徴量の数だけです.
決定木の特徴量数は一般的にサンプル数をnとしたときにn‾√n にすると良いと言われている.
from sklearn import ensemble classifier _ ensemble.RandomForestClassifier(n_estimator_20, max_depth_3, criterion="gini”)
AdaBoost
アンサンブル学習の一つ.ブースティングに分類されるアルゴリズム.
弱識別機の適用させ,誤分類してしまったものの重みを増やす.
そして,次にその重みがついたものを優先的にみて,分類.ということを繰り返す.
参考:
http://www.kameda-lab.org/lecture/2011-tsukubagrad-PRML/20111004_AIST_Makita.pdf
from sklearn import ensemble estimator = tree.DecisionTreeClassifier(max_depth=3) classifier _ ensemble.AdaBoostClassifier(base_estmator=estimator, n_estimator=20)