sckit-learn データセットを使った機械学習 回帰編1

回帰問題とは

数値を予測する問題です.学習時に入力データと出力データの組み合わせから対応する規則を学び,未知の入力データに対しても適切な出力を生成できるようにするもの.

つまり,入力と出力の関係(関数)を推定し,近似する問題と言える.



線形回帰

直線的な関係を推定する回帰.

Y= \omega_0 + \omega_1 x_1 + \omega_2 x_2 + … + \omega_p x_p

のような式に対し,(\omega_0, \cdot)\cdot)\cdot),\omega_pを求める問題として定式化される.
非線形回帰

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)

Matplotlibで画像を表示

from PIL import Image
from matplotlib import pylab as plt

# 画像の読み込み
img = np.array( Image.open('####.jpg') )

# 画像の表示
plt.imshow( img )

sckit-learn データセットを使った機械学習 分類編1

digitsデータセット読み込み表示

from sklearn import datasets
digits = datasets.load_digits()
#読み込みデータ表示
#digits.dataが入力データ
#digits.targetが判別結果
print(digits.data)  
[[  0.   0.   5. ...,   0.   0.   0.]
 [  0.   0.   0. ...,  10.   0.   0.]
 [  0.   0.   0. ...,  16.   9.   0.]
 ...,
 [  0.   0.   1. ...,   6.   0.   0.]
 [  0.   0.   2. ...,  12.   0.   0.]
 [  0.   0.  10. ...,  12.   1.   0.]]
digits.target
array([0, 1, 2, ..., 8, 9, 8])

#画像形式に変換して2行5列に表示
import matplotlib.pyplot as plt
#.target[:10]で9までのラベル,.images[:10]で9までの画像を取得
for label, img in zip(digits.target[:10], digits.images[:10]):
	plt.subplot(2, 5, label + 1)
	plt.axis('off')
	plt.imshow(img, cmap=plt.cm.gray_r, interpolation='nearest')
	plt.title('Digit: {0}'.format(label))

plt.show()

f:id:kobakenkken:20170809103358p:plain

参考
scikit-learn に付属しているデータセット – Python でデータサイエンス

python zip( )の使いかた

リスト内包表記

Python 2.7
[a+b+c+d for (a, b, c,d) in zip(list1, list2, list3, list4)]

Python 2.7
list1 = [1,2,3]
list2 = [2,3,4]
list3 = [5,6,7]

for (a, b, c) in zip(list1, list2, list3):
    print a, b, c
Python 2.7
for (a, b, c) in zip(list1, list2, list3):
    print (a+b+c)


plt.legend() matplotlib by python で凡例

. label=キーワード引数を使う場合

プロットをする際にlabel=キーワード引数で結びつけるラベルを渡すことができます。 結びつけたら、あとはplt.legend関数を呼び出すだけで凡例がグラフにプロットされます。

x = np.linspace(0, 10)
y_sin = np.sin(x)
y_cos = np.cos(x)

plt.plot(x, y_sin, label="sin")
plt.plot(x, y_cos, label="cos")
plt.legend()  # 凡例をグラフにプロット

f:id:bicycle1885:20140501222235p:plain

2. plt.legend()関数でartistとラベルを対応付ける

plt.plot()関数はArtistクラスのインスタンスのリストを返します。 これを受け取ってplt.legend()関数に渡すことでもラベルを結びつけることができます。

p1, = plt.plot(x, y_sin)
p2, = plt.plot(x, y_cos)
plt.legend([p1, p2], ["sin", "cos"])

f:id:bicycle1885:20140501222235p:plain

以下のことが成立することを確かめておきましょう。

assert isinstance(p1, matplotlib.artist.Artist)

凡例の位置調節

凡例の位置が他のプロットとかぶってしまう場合にはloc=キーワード引数を渡すことで 好きな位置に移すことができます。

プロットと被る

x = np.random.randn(100)
y1 = x + np.random.randn(100)
y2 = x * 3 + np.random.randn(100)
plt.plot(x, y1, "r.", label="label 1")
plt.plot(x, y2, "k.", label="label 2")
plt.legend()

f:id:bicycle1885:20140501222346p:plain

凡例の位置を左上(upper left)に置く

plt.plot(x, y1, "r.", label="label 1")
plt.plot(x, y2, "k.", label="label 2")
plt.legend(loc="upper left")

f:id:bicycle1885:20140501222409p:plain

あるいは右下(lower right)に置く

plt.plot(x, y1, "r.", label="label 1")
plt.plot(x, y2, "k.", label="label 2")
plt.legend(loc="lower right")

f:id:bicycle1885:20140501222425p:plain