55日目 機械学習の意味がわからず右往左往

昨日につづいて[Pythonによるスクレイピング＆機械学習 開発テクニック](https://www.socym.co.jp/book/1079)です。機械学習の章がはじまりました！

#4 機械学習とは
人間の脳が自然に行なっている「学習」をまねたもの。
データセットの中に一定の規則やルールがないかを調べていく仕組み。

###scikit-learn をインストール
機械学習のフレームワークをインストールします。

```
pip3 install -U scikit-learn scope matplotlib scimitar-image
```

さっそくわさわさ書いてみる。

```xor-test.py
from sklearn import svm

xor_data =[
[0,0,0],
[0,1,1],
[1,0,1],
[1,1,0]
]

data=[]
label=[]

for row in xor_data:
	p = row[0]
	q = row[1]
	r = row[2]
	data.append([p,q])
	label.append(r)

clf = svm.SVC()
clf.fit(data, label)

pre = clf.predict(data)
print("予測結果: ", pre)

ok  = 0; total=0
for idx,answer in enumerate(label):
	p = pre[idx]
	if p == answer: ok += 1
	total += 1
print("正解率: ", ok, "/", total, "=", ok/total) 
```

```実行結果
$ python xor-test.py 
/anaconda3/lib/python3.7/site-packages/sklearn/svm/base.py:193: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.
  "avoid this warning.", FutureWarning)
予測結果:  [0 1 1 0]
正解率:  4 / 4 = 1.0
```

`FutureWarning`がでてきました。

[python3 Anacondaについて　機械学習でエラー？が起こります](https://teratail.com/questions/184944)

将来的に仕様が変わって、gamma="auto”が"scale”になって予測精度があがるそうです。さっそく`clf = svm.SVC()`を`clf = svm.SVC(gamma="scale”)`に。FutureWarningが消えました。今の所のメリットはこのくらい。

そんで、このXOR演算が機械学習だというのですが、さっぱり意味がわかりません。まあ、やってくうちにわかるでしょう。

さて続き。
このプログラムをさくさく書けるフレームワークを使ってみます。

```xor-test2.py
import pandas as pd
from sklearn import svm,metrics

xor_input =[
[0,0,0],
[0,1,1],
[1,0,1],
[1,1,0]
]

xor_df = pd.DataFrame(xor_input)
#print(xor_df)
xor_data =xor_df.ix[:,0:1]
xor_label = xor_df.ix[:,2]

clf = svm.SVC(gamma="scale")
clf.fit(xor_data, xor_label)

pre = clf.predict(xor_data)

ac_score = metrics.accuracy_score(xor_label, pre)
print("正解率 = ", ac_score) 
```
実行結果

```
$ python xor_test2.py
xor_test2.py:12: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  xor_data =xor_df.ix[:,0:1]
xor_test2.py:13: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  xor_label = xor_df.ix[:,2]
正解率 =  1.0
```
`正解率 =  1.0` と結果はちゃんとでてきましたが、またしてもワーニングです。新しい本が出ているのに気づけばよかった・・・。

`.ix is deprecated. Please use`で調べると、いい記事がありました。

###[pandasでixを使うのはもうやめよう](https://qiita.com/junjis0203/items/fbde15dbba5ccdb5dc4c)

`.ix`だと自動でふられたインデックスを見に行ってしまうので、`.loc`か`iloc`に置き換えましょうとのこと。ためしてみると。


####`.loc`の場合
```
$ python xor_test2.py
正解率 =  1.0
```

####`iloc`の場合
```
$ python xor_test2.py
正解率 =  0.5
```

どうしてこう違うんだろう？

そこで`xor_data =xor_df.iloc[:,0:1]`をprintしてみました。
#####`.ix`
```
$ python xor_test2.py
xor_test2.py:12: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  xor_data =xor_df.ix[:,0:1]
data
   0  1
0  0  0
1  0  1
2  1  0
3  1  1
xor_test2.py:15: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
  xor_label = xor_df.ix[:,2]
正解率 =  1.0
```

#####`.loc`
```
$ python xor_test2.py
data
   0  1
0  0  0
1  0  1
2  1  0
3  1  1
正解率 =  1.0
```

#####`.iloc`
```
$ python xor_test2.py
data
   0
0  0
1  0
2  1
3  1
正解率 =  0.5
```

インデックス付きでデータを見る方に合わせるので、今回は`.loc`を使えばよさそうです。

（所要時間 ２時間）