0. 概要
해시스크래퍼の顧客事例の1つとして、AIモデルを使用して工場での不良率を減らすためにAIモデルを使用しました。機械学習モデルの予測をより深く理解しやすく説明するために、この記事を作成しました。
1. 問題の定義
1.1. 目標設定
まず、顧客事例を簡単に説明すると、128の変数に基づいて、各工程ごとに不良率に違いがあり、機械学習モデルを使用して不良品を予測し、機械学習モデルを使用してどの変数が不良を引き起こしたかを分析し、それらの変数を調整して不良率を減らすことが目標でした。
1.2. 仮説設定
工程中において、機械学習モデルを使用して主要な変数を抽出して調整すると、工程率が低下するという仮説を立てました。
2. データ収集
2.1. データソースの決定
データソースは、お客様が工場から直接各工程のデータを提供してくれたため、内部データであるため、直接公開することが難しく、フォルダーのキャプチャーを見せる形で提供しました。
2.2. データ収集
必要なデータは最低1万件をリクエストし、できるだけ多くのデータを提供してもらいたいと伝えました。
その結果、受け取った生データは次の通りです:
- 1号機: 3,931個
- 2号機: 16,473個
- 3号機: 2,072個
- 4号機: 16,129個
- 5号機: 57,970個
- 6号機: 78,781個
合計約17万5千個のデータを使用してモデルを学習しました。
3. データ前処理
3.1. データのクリーニング
モデルを学習する際にデータのクリーニングは非常に重要です。機械学習を通じたデータ学習の8割以上がクリーニングだと考えられます。
3.2. 作業手順
3.2.1. ファイルエンコーディング処理
まずファイルを読み込む際、csvを読み込む際のエンコーディング形式が異なるため、一部は'cp949'、一部は'utf-8'でエンコードして読み込みました。
for file_path in file_paths:
try:
df = pd.read_csv(file_path, encoding='cp949', header=None)
except UnicodeDecodeError:
df = pd.read_csv(file_path, encoding='utf-8', header=None)
3.2.2. ラベリング作業
ラベリングを行うために、日付と時間の列を結合し、その時間に関連するY軸データを接続しました:
for i in range(len(result_df_new) - 1):
start_time, end_time = result_df_new['Datetime'].iloc[i], result_df_new['Datetime'].iloc[i + 1]
selected_rows = df_yaxis[(df_yaxis['Datetime'] >= start_time) & (df_yaxis['Datetime'] < end_time)]
results.append(1 if all(selected_rows['결과'].str.contains('OK')) else 0)
results.append(0)
3.2.3. データ統合
各工程ごとに前処理されたデータを統合しました:
data = pd.concat([df1,df2,df3,df4,df6])
data.reset_index(drop=True,inplace=True)
3.2.4. 重複データの削除
重複データはデータセットに偏りをもたらし、モデルがデータの多様性を学習するのに問題が生じる可能性があります。また、過学習の問題が発生する可能性があるため、重複データはすべて削除しました:
data = data.drop_duplicates().reset_index(drop=True)
3.2.5. 欠損値の処理
missingnoライブラリを使用して欠損値を視覚化しました。そして、欠損値が多い列は完全に削除しました。欠損値の多い列を削除する理由は、前述と同様です。
3.3. フィーチャーエンジニアリング
モデルのパフォーマンスを向上させるために新しいフィーチャーを作成したり、既存のフィーチャーを変更することがフィーチャーエンジニアリングと呼ばれますが、私たちは各フィーチャーの値を正確に把握しておらず、すべてのフィーチャー値が重要であると考えたため、フィーチャーエンジニアリングは行いませんでした。
3.4. EDA(探索的データ分析)
データ分布の確認
ヒストグラム、ボックスプロットなどのグラフを使用してデータの分布を確認します。
相関関係の分析
フィーチャー間の相関関係を分析して重要なフィーチャーを特定したり、多重共線性の問題を解決します。
4. サンプリングタイプ
4.1. データ不均衡の処理
データには不均衡が多かったため、複数のモデルと組み合わせてアンダーサンプリングを試みました。さまざまなアンダーサンプリング手法を試しました:
- ランダムアンダーサンプリング (RUS): 多数クラスからランダムにデータを削除
- NearMiss: 少数クラスのデータと最も近いk個の多数クラスのデータのみを保持
- Tomek Links: お互いに最も近いデータペアを見つけ、多数クラスのデータを削除
- Edited Nearest Neighbors (ENN): k-NNアルゴリズムを使用して多数クラスのデータを削除
- Neighbourhood Cleaning Rule (NCL): ENNの拡張バージョン
最終的にENNアンダーサンプリングが最も適していると判断し、適用しました。
# NearMiss 인스턴스 생성
nm = NearMiss()
# 언더샘플링 수행
X_resampled, y_resampled = nm.fit_resample(data.drop('결과', axis=1), data['결과'])
# 언더샘플링 결과를 DataFrame으로 변환
data_sample = pd.concat([X_resampled, y_resampled], axis=1)
5. モデリング
5.1. モデル選択
問題の種類(分類、回帰、クラスタリングなど)に応じて適切な機械学習モデルを選択します。モデル選択では、直接複数のモデルを実行することもありましたが、PyCaretライブラリを使用して最適なモデルを選択しました。
PyCaretは、Pythonのオープンソースのデータ分析および機械学習自動化ライブラリです。PyCaretは、ユーザーに少ないコード量で全体のデータ分析および機械学習パイプラインを迅速に構築し、実験する能力を提供します。
5.2. モデルトレーニング
学習データを使用してモデルをトレーニングします。最終的にはCatBoostモデルを使用して、AUC値とF1スコア値が最も高くなりました。
評価指標の説明:
AUC (Area Under the Curve):
- AUCはROC(Receiver Operating Characteristic)曲線の下の面積を意味します。
- AUC値は0から1の間にあり、値が1に近いほど、分類器のパフォーマンスが良いと見なされます。
- AUCは不均衡なクラス分布で特に有用です。
F1スコア:
- F1スコアは適合率(Precision)と再現率(Recall)の調和平均です。
- 適合率は陽性と予測されたもののうち、実際の陽性の割合であり、再現率は実際の陽性のうち、陽性として正しく予測された割合です。
- F1スコアの値は0から1の間にあり、値が高いほどモデルのパフォーマンスが良いと見なされます。
6. 結論: 変数の抽出と直感性を高めた機能の追加
最終的に、工場にある機器が生成する生データをリアルタイムで取得し、このモデルを使用して予測し、SHAPライブラリを使用して不良品に関連する変数を抽出しました。
また、工場で作業する一般の方々のために、PyInstallerを使用してこの一連のプロセスでExcelファイルが最終的に生成され、一度クリックするだけでその生データに関する変数と不良品かどうかを判断できるようにExcelで表示されるようにしました。
SHAPとは?
SHAPはSHapley Additive exPlanationsの略で、機械学習モデルの各フィーチャーが予測にどれだけ影響を与えたかを説明するために使用されるツールです。これにより、モデルの「透明性」が向上し、その結果、予測がどのように行われたかに対する信頼性が向上します。
結論
해시스크래퍼は、上記のようなケースでは、上記の方法論に基づいたAIモデルを使用してプロジェクトを進めています。データ前処理からモデリング、そして最終ユーザー向けの直感的なインターフェースまで完全なソリューションを提供することで、実際の工程での不良率を効果的に減らすことができました。




