前提・実現したいこと
製造現場において、生産時のプロセス情報(生産設備の使用号機、生産中に製品が停止した時間)を基に
不良品が発生するかどうかの2値分類モデルを作りたいです。
発生している問題・エラーメッセージ
不良品が発生する確率は100個中2~3個程度です。
下記のアルゴリズムで試しました。
・ランダムフォレスト
・ロジスティック回帰
・決定木
・ニューラルネットワーク
不良品300個と良品300個のデータを用いて学習及びテストを行った結果は下記通りです。
学習データ:精度、適合率、再現率、F値は全て90%以上
テストデータ:精度、適合率、再現率、F値は全て80%以上
しかし、上記で学習させた後、1万個ほどのデータでテストすると、
下記のように低くなります。
精度60%、適合率5%、再現率98%、F値10%
エラーメッセージ
該当のソースコード
python
1import pandas as pd 2test_file = "data.csv" 3test_file2 = "test_N.csv" 4 5df_make = pd.read_csv(test_file,engine="python") 6df_make.describe() 7 8#■標準化■ 9from sklearn.preprocessing import StandardScaler 10stdsc = StandardScaler() 11df_make[['ラインの停止区間A',ラインの停止区間B']] = stdsc.fit_transform(df_make[['ラインの停止区間A','ラインの停止区間B']]) 12 13df_y = df_make["不良"] 14df_make = pd.get_dummies(df_make, columns=["製品の位置情報"]) 15df_make = pd.get_dummies(df_make, columns=["使用装置"]) 16df_x = df_make.drop(["不良"], axis=1) 17 18#■機械学習■ 19from sklearn.model_selection import train_test_split 20train_x, test_x, train_y, test_y = train_test_split(df_x, df_y,stratify = df_y, test_size = 0.9, random_state=0) 21 22#ここで不良あり/なしの個数を確認 23train_y.value_counts() 24 25 26#■アルゴリズム選択■ 27#ロジスティック回帰 (このコードではこのアルゴリズムを使用) 28from sklearn.linear_model import LogisticRegression 29model = LogisticRegression(C=10) 30 31#ランダムフォレスト 32from sklearn.ensemble import RandomForestClassifier 33model = RandomForestClassifier(random_state=random_seed) 34model = RandomForestClassifier(3) 35 36#決定木 37from sklearn.tree import DecisionTreeClassifier 38model = DecisionTreeClassifier(max_depth = 2) 39 40#XGBoost 41from xgboost import XGBClassifier 42model = XGBClassifier(3) 43 44#ニューラルネットワーク 45from sklearn.neural_network import MLPClassifier 46model = MLPClassifier(hidden_layer_sizes=(200,200), random_state=random_seed) 47 48 49 50model.fit(train_x,train_y) 51pred = model.predict(train_x) 52 53import matplotlib.pyplot as plt 54%matplotlib inline 55 56import numpy as np 57plt.plot(pred, color="red") #AIの予想 = 赤 58plt.plot(np.array(train_y), color="black", linestyle="dotted",linewidth="0.2") #答え = 黒 59 60 61#■学習データで精度確認■ 62from sklearn.metrics import precision_recall_fscore_support 63 64precision, recall, fscore, _ = precision_recall_fscore_support(train_y, pred, average='binary') 65score = model.score(train_x, train_y) 66 67print(f'精度: {score:.4f}') 68print(f'適合率: {precision:.4f}') 69print(f'再現率: {recall:.4f}') 70print(f'F値: {fscore:.4f}') 71 72pred2 = model.predict(test_x) 73 74plt.plot(pred2, color="red") #予測線 75plt.plot(np.array(test_y), color="black", linestyle="dotted",linewidth="0.2") #答え 76 77#■テストデータで精度確認■ 78precision, recall, fscore, _ = precision_recall_fscore_support(test_y, pred2, average='binary') 79score = model.score(test_x, test_y) #決定係数を確認する。1に近いほど精度が良い。 80 81print(f'精度: {score:.4f}') 82print(f'適合率: {precision:.4f}') 83print(f'再現率: {recall:.4f}') 84print(f'F値: {fscore:.4f}') 85 86 87#■他のデータ(1万個のデータ)の予測■ 88df_make2 = pd.read_csv(test_file2,engine="python") 89 90df_make2[['ラインの停止区間A',ラインの停止区間B']] = stdsc.fit_transform(df_make[['ラインの停止区間A','ラインの停止区間B']]) 91 92test_y2 = df_make2["不良"] 93df_make2 = pd.get_dummies(df_make2, columns=["製品の位置情報"]) 94df_make2 = pd.get_dummies(df_make2, columns=["使用装置"]) 95test_x2 = df_make2.drop(["不良"], axis=1) 96 97pred_test = model.predict(test_x2) 98 99plt.plot(pred_test, color="red") #予測線 100plt.plot(np.array(test_y2), color="black", linestyle="dotted",linewidth="0.2") #答え 101 102precision, recall, fscore, _ = precision_recall_fscore_support(test_y2, pred_test, average='binary') 103score = model.score(test_x2, test_y2) 104 105print(f'精度: {score:.4f}') 106print(f'適合率: {precision:.4f}') 107print(f'再現率: {recall:.4f}') 108print(f'F値: {fscore:.4f}') #←ここでF値が10%ほどしか出ない 109 110
試したこと
特徴量の増加:4個 → 7個
補足情報(FW/ツールのバージョンなど)
使用言語:Python
作業環境:jupyter notebook
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/19 05:35
2020/11/19 10:15
2020/11/19 23:14
2020/11/20 03:37
2020/11/20 03:55
2020/11/20 11:48
2020/11/20 12:19
2020/11/23 02:35
2020/11/23 03:17
2020/11/24 03:13