###### 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 ``` - かなり良い精度が出てしまったので、本当にこれで良いものかと困惑しているところです... - その他の手法でも精度がどれくらい出るのかを調べたい