2019年9月9日月曜日

RFIDの読取結果を機械学習でクラス分類してみた

前回に引き続き、今回はRFIDの読取結果を機械学習クラス分類してみようと思います。クラス分類にはk近傍法を利用します。では、さっそく始めます。

今回使ったもの(前回同様)


ICタグの読取手順(前回同様)

まず、ICタグを5枚ずつ、数十㎝離して4箇所に配置しました。読取は各箇所の上空にRF Blasterを順番にかざすような感じで読み取りました。(なんだか恣意的ですが)各箇所には上位ビットが同じで下位のシリアルが1~5となっているものをひとまとめにして置いてあります。

Microsoft Azure Notebooks

前回同様Microsoft Azure Notebooksを使用しました。使ったプロジェクトはこちらです。CSVファイルは同じものを使いました。使ったNotebookはこちらです。初めに、pandas, numpyをimportしています。次にDataFrameにデータを取込んで加工しています。今回は前回一番よかった秒単位の読取回数を使ってクラス分類してみようと思います。

pvCountT = df.reset_index().pivot_table(index=[pd.Grouper(freq='1s', key='DateTime')], columns=["TagID"], values="RSSI", aggfunc=np.count_nonzero).fillna(0).T

TagIDの上位7文字をlocationとして設定します。

pvCountT['location']=pvCountT.index.str.replace('[0-9]{9}$','')

各ロケーションに置かれたタグのうち、タグIDの末尾が'0001', '0002', '0003'のものを教師データとします。

train_data=pvCountT.iloc[pvCountT.index.str.endswith(('0001','0002','0003')),:]

同様に末尾が'0004', '0005'をテストデータとします。

test_data=pvCountT.iloc[pvCountT.index.str.endswith(('0004','0005')),:]

kの値を3としたときのk近傍法の結果です。

knn = KNN(n_neighbors=3, n_jobs=-1)
knn.fit(
    X = train_data.iloc[:,use_column].values, 
    y = train_data["location"].values,
)
pred_target =knn.predict(
    X = test_data.iloc[:,use_column].values, 
)
print(sum(test_data['location']==pred_target)/len(pred_target))
0.875

結果は87.5%の正答率でした。まずまずでしょうか。次にkの値を5としたときのk近傍法の結果です。

knn5 = KNN(n_neighbors=5, n_jobs=-1)
knn5.fit(
    X = train_data.iloc[:,use_column].values, 
    y = train_data["location"].values,
)
pred_target5 =knn5.predict(
    X = test_data.iloc[:,use_column].values, 
)
print(sum(test_data['location']==pred_target5)/len(pred_target5))
1.0

今度は100%の正答率が得られました。各位置ごとに3つの教師データがあるので、近傍の5個のデータを見ると、位置が正確に分かるということでしょうか。 最後にkの値を7としたときの結果です。

knn7 = KNN(n_neighbors=7, n_jobs=-1)
knn7.fit(
    X = train_data.iloc[:,use_column].values, 
    y = train_data["location"].values,
)
pred_target7 =knn7.predict(
    X = test_data.iloc[:,use_column].values, 
)
print(sum(test_data['location']==pred_target7)/len(pred_target7))
0.5

今度は正答率が50%まで下がってしまいました。教師データが3つしかないのに、近傍7個のデータを見に行って下がってしまったということでしょうか。

まとめとこれから


今回はRFID読取結果を機械学習のk近傍法を使ってクラス分類してみました。結果に対する考察と背景の勉強はまだまだ行っていく必要がありますが、クラスタリング同様RFIDの読取結果に対して分析することができました。

応用としては、前回記載した通り、RFIDを使った棚卸で位置の決まったタグの読取結果を教師データとして、その他の物品の位置を推定するのに使えるかもしれません。ただ、一般には位置タグの数<<<物品タグの数なので、その辺がどうなるのかもう少し大きなデータセットで試してみたいと思います。


0 件のコメント:

コメントを投稿