###### tags: '研究関係'
# 機械学習を使って移動タグと静止タグの識別をしてみようの会
## 使用するアルゴリズムについて
- ランダムフォレストを使用
- scikit-learnで実装する
- 参考URL↓
https://qiita.com/Hawaii/items/5831e667723b66b46fba
https://ebi-works.com/random-forest/
## データセット
- 使用するデータセットはこれ(statistics.zip)
→ https://drive.google.com/drive/folders/1TGGp7oF-rIL4yP5qoT-_7cQreAznSZOA
- データ構造は下記の通り
```
RSSI_average RSSI_max RSSI_min RSSI_variance Phase_average Phase_max Phase_min Phase_variance state
0 -52.479592 -39.0 -71.5 74.020408 3.022819 6.221826 0.110447 3.120384 moving
1 -42.360000 -28.5 -60.5 97.918776 2.811664 6.092972 0.122718 3.478058 moving
2 -55.157895 -47.0 -64.0 27.001422 3.518790 6.258642 0.846757 3.324728 moving
3 -53.638889 -50.0 -57.0 6.464869 2.167685 5.743224 0.171806 1.992179 moving
4 -50.095745 -37.0 -68.5 78.833025 2.994200 6.154331 0.153398 3.647578 moving
.
.
```
- 30-5は静止タグ30枚、移動タグ5枚の場合のデータをまとめたもの。(5-30は静止タグ5枚、移動タグ30枚)
## ランダムフォレストにデータを投げ込む
- 参考URLを、今回のデータセットに合わせながら投げ込むだけ。
- Nan値が含まれているとエラー吐かれるので、エラーが出たらその都度ファイルを確認することをおすすめします。
- 今回のコード↓
```
import pandas as pd
import numpy as np
import datetime
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
#データ読み込み
df30_5 = pd.read_csv("/Users/pluslab/Documents/RFID/30-5/alldata.csv")
df5_30 = pd.read_csv("/Users/pluslab/Documents/RFID/5-30/alldata.csv")
df_all = pd.read_csv("/Users/pluslab/Desktop/all.csv")
# データセットの外観確認
# print(df30_5.shape)
print(df30_5.head())
# moving = 0, static = 1 に変換
df30_5["state"] = df30_5["state"].replace("moving", 0)
df30_5["state"] = df30_5["state"].replace("static", 1)
df30_5 = pd.get_dummies(df30_5,drop_first = True)
df5_30["state"] = df5_30["state"].replace("moving", 0)
df5_30["state"] = df5_30["state"].replace("static", 1)
df5_30 = pd.get_dummies(df5_30,drop_first = True)
df_all["state"] = df_all["state"].replace("moving", 0)
df_all["state"] = df_all["state"].replace("static", 1)
df_all = pd.get_dummies(df_all,drop_first = True)
# 指定の列にNan値が存在するかどうかを確認
for idx in df30_5.index:
if np.isnan(df30_5.loc[idx, 'RSSI_variance']):
print(idx)
for idx in df5_30.index:
if np.isnan(df5_30.loc[idx, 'RSSI_variance']):
print(idx)
# 訓練データとテストデータに分割
train_data1 = df30_5.drop("state", axis = 1)
y1 = df30_5["state"].values
X1 = train_data1.values
X1_train, X1_test, y1_train, y1_test = train_test_split(X1, y1, test_size = 0.2, random_state = 0)
train_data2 = df5_30.drop("state", axis = 1)
y2 = df5_30["state"].values
X2 = train_data2.values
X2_train, X2_test, y2_train, y2_test = train_test_split(X2, y2, test_size = 0.2, random_state = 0)
train_data3 = df_all.drop("state", axis = 1)
y3 = df_all["state"].values
X3 = train_data3.values
X3_train, X3_test, y3_train, y3_test = train_test_split(X3, y3, test_size = 0.2, random_state = 0)
# ランダムフォレストに投げ込む
clf = RandomForestClassifier(random_state = 0)
clf.fit(X1_train, y1_train)
clf.fit(X2_train, y2_train)
clf.fit(X3_train, y3_train)
# スコア表示
print("-------------score-------------")
print("30-5:", clf.score(X1_test, y1_test))
print("5-30:", clf.score(X2_test, y2_test))
print("all:", clf.score(X3_test, y3_test))
```
## 結果
- 30-5, 5-30, allの3パターン(allは30-5と5-30のデータを全てまとめた場合)
```
-------------score-------------
30-5: 1.0
5-30: 1.0
all: 0.9997601918465228
```
- かなり良い精度が出てしまったので、本当にこれで良いものかと困惑しているところです...
- その他の手法でも精度がどれくらい出るのかを調べたい