Pythonによる AI・機械学習について学んだ内容(3)

#はじめに
この本を使って勉強しています
[Pythonによる AI・機械学習・深層学習アプリのつくり方](https://www.socym.co.jp/book/1164)

#scikit-learn
Python向けの機械学習フレームワークの定番
http://scikit-learn.org/

次の特徴がある

- 機械学習で使われるさまざまなアルゴリズムに対応
- すぐに機械学習を試すことができるようにサンプルデータが含まれる
- 機械学習の結果を検証する機能を持っている
- 機械学習でよく使われる他のライブラリ(Pnadas, Numpy, scipy, Matplotlib etc)と親和性が高い
- BSDライセンスのオープンソースのため無料で商用利用可能

#アルゴリズムを選択する
https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561197/443071d4-9f9c-915b-5a55-70567731b02f.png)
どのような機械学習をしたいか、どのようなデータを準備しているのかなどの条件をたどっていくとアルゴリズムを選択できるようになっている。


#AND演算を機械学習する

```python:and.py
# ライブラリをインポートする
from sklearn.svm import LinearSVC            # LinearSVC アルゴリズムを利用するためのパッケージ(sklearn.svm.LinearSVC)
from sklearn.metrics import accuracy_score   # テスト結果を評価するためのパッケージ(sklearn.metrics.accuracy_score)
                           

#学習データを用意
learn_data  = [[0, 0], [1, 0], [0, 1], [1, 1]] # 学習用の入力データ(AND の入力値)
learn_label = [0, 0, 0, 1]                     # 学習用の結果データ(AND の出力値)

# アルゴリズムの指定
clf = LinearSVC()  

# 学習する(学習用の入力データと結果データを渡す)
clf.fit(learn_data, learn_label)               # 学習用の入力データと結果データを渡す

# 学習を検証する
test_data = [[0, 0], [1, 0], [0, 1], [1, 1]]   # テストデータの入力データを用意
test_label = clf.predict(test_data)            # テストデータの結果を取得

# テストデータの結果を表示
print(test_data, "の予測結果", test_label)

# 正解率を表示
Accuracy_rate= accuracy_score([0, 0, 0, 1], test_label) # accuracy_score(正解データ, テストの結果)
print("正解率:", Accuracy_rate)
```

```
[[0, 0], [1, 0], [0, 1], [1, 1]] の予測結果 [0 0 0 1]
正解率: 1.0
```
AND論理演算を正しく学習している。
線形に分類できるものは、LinearSVCアルゴリズムで解決できる。
でも、XORは？

#使用される単語
- SVM(Support Vector Machine)
　「本当に予測に必要となる一部のデータ」のこと
　　[このサイトがわかりやすい](https://logics-of-blue.com/svm-concept/)

- Linear SVM Classification ... 線形 SVM 分類
- accuracy ... 精度・正確さ
- classification ... 分類
- classifier ... 分類器
- fit ... 学習する(適合する)
- predict ... 予測する

#XOR演算を機械学習する

```python:xor.py
# ライブラリをインポートする
from sklearn.svm import LinearSVC            # LinearSVC アルゴリズムを利用するためのパッケージ(sklearn.svm.LinearSVC)
from sklearn.metrics import accuracy_score   # テスト結果を評価するためのパッケージ(sklearn.metrics.accuracy_score)
                           

#学習データを用意
learn_data  = [[0, 0], [1, 0], [0, 1], [1, 1]] # 学習用の入力データ(XORの入力値)
learn_label = [0, 1, 1, 0]                     # 学習用の結果データ(XORの出力値)

# アルゴリズムの指定
clf = LinearSVC()  

# 学習する(学習用の入力データと結果データを渡す)
clf.fit(learn_data, learn_label)               # 学習用の入力データと結果データを渡す

# 学習を検証する
test_data = [[0, 0], [1, 0], [0, 1], [1, 1]]   # テストデータの入力データを用意
test_label = clf.predict(test_data)            # テストデータの結果を取得

# テストデータの結果を表示
print(test_data, "の予測結果", test_label)

# 正解率を表示
Accuracy_rate= accuracy_score([0, 1, 1, 0], test_label) # accuracy_score(正解データ, テストの結果)
print("正解率:", Accuracy_rate)
```

```
[[0, 0], [1, 0], [0, 1], [1, 1]] の予測結果 [0 0 0 0]
正解率: 0.5
```

うーん、線形では正しく分類できない。

```python:xor2.py
# ライブラリをインポートする
from sklearn.neighbors import KNeighborsClassifier # LinearSVC アルゴリズムを利用するためのパッケージ(sklearn.svm.LinearSVC)
from sklearn.metrics import accuracy_score         # テスト結果を評価するためのパッケージ(sklearn.metrics.accuracy_score)


#学習データを用意
learn_data  = [[0, 0], [1, 0], [0, 1], [1, 1]] # 学習用の入力データ(XORの入力値)
learn_label = [0, 1, 1, 0]                     # 学習用の結果データ(XORの出力値)

# アルゴリズムの指定
clf = KNeighborsClassifier(n_neighbors = 1)  

# 学習する(学習用の入力データと結果データを渡す)
clf.fit(learn_data, learn_label)               # 学習用の入力データと結果データを渡す

# 学習を検証する
test_data = [[0, 0], [1, 0], [0, 1], [1, 1]]   # テストデータの入力データを用意
test_label = clf.predict(test_data)            # テストデータの結果を取得

# テストデータの結果を表示
print(test_data, "の予測結果", test_label)

# 正解率を表示
Accuracy_rate= accuracy_score([0, 1, 1, 0], test_label) # accuracy_score(正解データ, テストの結果)
print("正解率:", Accuracy_rate)
```

```
[[0, 0], [1, 0], [0, 1], [1, 1]] の予測結果 [0 1 1 0]
正解率: 1.0
```

KNeighborsClassifierアルゴリズムを使うと学習できた。