🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3456閲覧

pythonを使用した機械学習 モーターの故障予知 モデル リアルタイムモデリング 結果出力 変数の型 について

endo_t

総合スコア6

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/28 06:18

編集2021/01/29 07:03

Pythonを使用した機械学習 モーターの故障予知

pythonを使用して機械学習によるモーターの故障予知を実装しようとしております。
(ラボレベルの小規模の試験です。)
計測データは2点
・モーター負荷電流
・振動値
上記2点をPLCへ入力し、PLC⇒PCへpython上で値を取得しています。
この2つの値を使用し、簡単な機械学習モデルを作成し、
計測した値をリアルタイムでそのモデルに流し、評価を行う、といったものを実装したく考えております。
裏の目的は機械学習の触りを知ってもらうための展示品としての作成です。

発生している問題・エラーメッセージ

1.適切なモデルがわからない。(現在はk近傍法) 2.リアルタイムでのモデリングを行う際に適切な値の格納方法、   格納の型についてアドバイスをいただきたい。   (イメージは1回/1秒でサンプリングしたデータを10個程度配列型に格納し、    その配列データをモデルに流し込んで結果を出力する、というやり方です。) 3.結果の出力方法についてアドバイスをいただきたい。   現在0-1でしか出力ができておらず、可視化するにもチープな状態です。 どれか1つでもアドバイスできそうな項目がございましたらご助言いただけますと幸いでございます。 よろしくお願い致します。

該当のソースコード

python

1import csv 2import socket 3import time 4import pandas as pd 5from sklearn.neighbors import KNeighborsClassifier 6from sklearn.metrics import accuracy_score 7 8 9host_ip = '192.168.4.10' # kv-5000のIPアドレス 10host_port = 8501 # 上位リンク通信のポート番号 11 12client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13# socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 14client.connect((host_ip,host_port)) 15 # サーバーに接続(kv-7500にTCP接続/上位リンク通信) 16 17test_data=[] 18learn_data=[] 19learn_label=[] 20test_label=[] 21 22num = 1 23 24df1 = pd.DataFrame({'input1': ['0'],'input2': ['0']},index=[0]) 25df2= pd.DataFrame({'input1': ['0'],'input2': ['0']},index=[0]) 26 27print("////教師データ入力////") 28print("正常データ入力:エンターを押すと教師データが入力される") 29input_data = input() 30while num < 10 : # 回数分繰り返す 31 32 comand0 = "RD DM10102.D\r" # ch0読み出しコマンド 33 comand1 = "RD DM10112.D\r" # ch1読み出しコマンド 34 35 client.send(comand0.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード 36 client.send(comand1.encode("ascii")) 37 38 response0 = client.recv(1024) 39 response1 = client.recv(1024) 40 41 response0 = response0.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード 42 response1 = response1.decode("UTF-8") 43 44 response0 = float(response0)/1000 # Float型へ変換し単位をそろえる 45 response1 = float(response1)/1000 46 47 print(num," ch0 :",response0,"V"," ch1:",response1,"V") # 表示 48 df1.loc[num] =[response0,response1] 49 num +=1 50 time.sleep(0.5) # n秒ごと 51 learn_data.append([response0,response1]) 52 learn_label.append(1) 53 54else: 55# client.close() 56 print("異常データ入力:エンターを押すと教師データが入力される") 57 input_data = input() 58 while num < 20 : 59 60 comand0 = "RD DM10102.D\r" # ch0読み出しコマンド 61 comand1 = "RD DM10112.D\r" # ch1読み出しコマンド 62 63 client.send(comand0.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード 64 client.send(comand1.encode("ascii")) 65 66 response0 = client.recv(1024) 67 response1 = client.recv(1024) 68 69 response0 = response0.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード 70 response1 = response1.decode("UTF-8") 71 72 response0 = float(response0)/1000 # Float型へ変換し単位をそろえる 73 response1 = float(response1)/1000 74 75 print(num," ch0 :",response0,"V"," ch1:",response1,"V") # 表示 76 df1.loc[num] =[response0,response1] 77 num +=1 78 time.sleep(0.5) # n秒ごと 79 learn_data.append([response0,response1]) 80 learn_label.append(0) 81 else: 82 client.close() 83 84 85 86client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 87# socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 88client.connect((host_ip,host_port)) 89 90 91 92print("比較データ入力:エンターを押すと比較データが入力される") 93input_data = input() 94 95num =1 96 97# アルゴリズムを指定。K最近傍法を採用 98clf = KNeighborsClassifier(n_neighbors=1) 99 100# 学習用のデータと結果を学習する,fit() 101clf.fit(learn_data, learn_label) 102 103while num < 20 : # 回数分繰り返す 104 105 comand0 = "RD DM10102.D\r" # ch0読み出しコマンド 106 comand1 = "RD DM10112.D\r" # ch1読み出しコマンド 107 108 client.send(comand0.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード 109 client.send(comand1.encode("ascii")) 110 111 response0 = client.recv(1024) 112 response1 = client.recv(1024) 113 114 response0 = response0.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード 115 response1 = response1.decode("UTF-8") 116 117 response0 = float(response0)/1000 # Float型へ変換し単位をそろえる 118 response1 = float(response1)/1000 119 120 121 print(num," ch0 :",response0,"V"," ch1:",response1,"V") # 表示 122 df1.loc[num] =[response0,response1] 123 num +=1 124 time.sleep(0.5) # n秒ごと 125 test_data.append([response0,response1]) 126 test_label = clf.predict(test_data) 127 128else: 129 client.close() 130 131# アルゴリズムを指定。K最近傍法を採用 132 133clf = KNeighborsClassifier(n_neighbors=1) 134 135# 学習用のデータと結果を学習する,fit() 136clf.fit(learn_data, learn_label) 137 138# テストデータによる予測,predict() 139test_label = clf.predict(test_data) 140 141print(test_label)

試したこと

Kaggleで勝つ データ分析の技術 という本を読みました。

補足情報(FW/ツールのバージョンなど)

jupyterNotebookを使用してます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1.適切なモデルがわからない。(現在はk近傍法)

こちらの記事が参考になると思います。k近傍法は基本なので、初手としてはよいと思います。

2.リアルタイムでのモデリングを行う際に適切な値の格納方法

上記の記事のソースを見るとわかりますが、発生するデータは配列にどんどん溜め込んで、スライスで必要な箇所を取り出すイメージです。真面目にやると、センシング側と分析・表示側でスレッドを分けるか完全に別プロセスにして、時系列DBを介してデータの読み書きをするとよいです。いわゆるIoTシステムのアーキテクチャーになります。

3.結果の出力方法についてアドバイスをいただきたい。

k近傍法の予測結果を出す関数には、ラベルとの距離を出力するものがありますので、それをお使いいだたくのがよいと思います。平常であるクラス0との距離をグラフ化してください。最初に示した記事もそうなっていますし、お使いいただいているKNeighborsClassifierにも距離を出す関数があります。

また、こちらの記事のように、リアルタイムでグラフ表示更新をすることと組み合わせると、デモとしては映えると思います。なお、リアルタイムグラフで「魅せる」には、サンプリング間隔は1秒では物足りないです。100ms程度にすると、ヌルヌル感がしてよいと思います。

投稿2021/01/30 00:34

編集2021/02/13 08:42
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

endo_t

2021/02/12 05:15

リンクが消えていました、、、、再度張り付けいただくことはできますか?
endo_t

2021/02/12 05:37

また、時系列DBを介しての読み書き、非常に助かるアドバイスでした。有難うございます。 リアルタイムでDBへ書き込みについて、例えば、 time     device1 device2 00:00:00:00 0.28  0.17 00:00:00:05 0.28  0.17 00:00:00:10 0.28  0.17 00:00:00:15 0.28  0.17 ・ ・ のように時系列DBを作成し、そのDBをモデルを動かすプログラムで周期的に読みに行く(1秒に1回とか)といったイメージでしょうか? 時系列DBについてググってみましたが、ローカル上にDBファイルを作成することはできるんですかね、、皆様AzureやAWS等にアクセスしており参考にできるソースなどが見つけられず、、ご助言いただけますと幸いです。 時系列DBを作成する方法もぐぐっているところでございます。。
toast-uz

2021/02/12 10:59 編集

最初のリンク記事は削除されていましたので、似たような故障検知にk近傍法を適用している記事に差し替えました。時系列DBはローカル配置を検討するよりはクラウド利用をオススメします。Amazon Timestreamとかですね。使い方はご理解の通りです。
toast-uz

2021/02/13 08:43

リンクは方式比較とコード実装例が掲載されているものに差し替えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問