目次
1. Pulearnの概要
2. 実験
2.1 データロード
2.2 SVCモデル
2.3 BaggingPuClassifierのSVCモデル
3. まとめ
1.Pulearnの概要
Pu learningとは Learning from Positive and Unlabeled dataの英語略称で、陽性のラベルとラベルなしデータで学習です。通常の二項分類分析には、1はラベル陽(positive)、0は陰性(negative)であるデータセットです。一方で、0は陰性ではなく、明示的に与えられないデータもあり、そのようなデータセットはpu learningの手法を利用します。
今回の記事では、pulerningを実験したいと思います。
論文:https://cseweb.ucsd.edu//~elkan/posonly.pdf
資料:https://pulearn.github.io/pulearn/
2.実験
環境:Google Colab
データセット:陽性のラベルとラベルなしデータセットを見つけないので、scikit-learnの二項分類のbreast_cancerのデータセットにします。
モデル: SVCモデル vs BaggingPuClassifier SVCモデル
2.1 データロード
ライブラリのインストール
!pip install pulearn |
データロードします。
569件のデータは陽性のラベルが357件あります。
import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer() data = pd.DataFrame(np.c_[cancer[‘data’], cancer[‘target’]], columns= np.append(cancer[‘feature_names’], [‘target’]))
X = data.drop(columns=[‘target’]) y = data.target print(“Total “, len(y)) print(“y true”, sum(y)) |
Total 569
y true 357
300件のラベルできないラベルは0に変更します。
y_orig = y.copy()
# Unlabel a certain number of data points hidden_size = 300 y.loc[ np.random.choice( y[y == 1].index, replace = False, size = hidden_size ) ] = 0 |
57件の陽性のラベルになりました。このデータをモデルを学習します。
print(“Total “, len(y)) print(“original postive”, sum(y_orig)) print(“new postive”, sum(y)) |
Total 569
original postive 357
new postive 57
2.2 SVCモデル
SVMモデルを学習して、予測値(y_pred_svc)と確信度(y_predict_proba_svc’)を計算します。
from sklearn.svm import SVC
svc_classifier = SVC(gamma=’auto’, probability=True) svc_clf = svc_classifier.fit(X, y)
results = pd.DataFrame({ ‘y_truth’ : y_orig, ‘y_train’ : y, ‘y_pred_svc’ : svc_clf.predict(X), ‘y_predict_proba_svc’ : svc_clf.predict_proba(X)[:,1] }, columns = [‘y_truth’, ‘y_train’, ‘y_pred_svc’, ‘y_predict_proba_svc’])
results |
結果を確認します。
予測値は陽性のラベルが53件になります。 学習のデータ通りに、モデルができました。
print(“total: “, len(y)) print(“y_truth: “, sum(results.y_truth)) print(“y_train: “, sum(results.y_train)) print(“y_pred_svc: “, sum(results.y_pred_svc )) |
total: 569
y_truth: 357
y_train: 57
y_pred_svc: 53
2.3 BaggingPuClassifierのSVCモデル
BaggingPuClassifierをりようして、SVCモデルを学習します。
from pulearn import BaggingPuClassifier from sklearn.svm import SVC
svc = SVC(C=10, kernel=’rbf’, gamma=0.4, probability=True) pu_estimator = BaggingPuClassifier( base_estimator=svc, n_estimators=15) b_pu_clf = pu_estimator.fit(X, y) |
結果をまとめます。
results[‘y_pred_bag’] = b_pu_clf.predict(X) results[‘y_predict_proba_bag’] = b_pu_clf.predict_proba(X)[:,1] results |
予測の結果をまとめます。
BaggingPuClassifierのSVCの予測は実際のラベルのような予測値です。予測の陽性のラベルが476件になります。
print(“total: “, len(y)) print(“y_truth: “, sum(results.y_truth)) print(“y_train: “, sum(results.y_train)) print(“y_pred_svc: “, sum(results.y_pred_svc )) print(“y_pred_svc: “, sum(results.y_pred_bag )) |
total: 569
y_truth: 357
y_train: 57
y_pred_svc: 53
y_pred_bag: 476
実際のラベルに対して、BaggingPuClassifierを使うと、精度が通常よりも高いことがわかります。
from sklearn.metrics import accuracy_score
print(accuracy_score(results.y_true, results.y_pred_svc)) print(accuracy_score(results.y_true, results.y_pred_bag)) |
0.46748681898066785
0.5325131810193322
3.まとめ
ラベルできないラベルのデータセットでSVCモデルとBaggingPuClassifierのSVCモデルを学習しました。BaggingPuClassifierはラベルしていないラベルのデータセットのモデルは実際のラベルのような予測結果ができました。
担当者:KW
バンコクのタイ出身 データサイエンティスト
製造、マーケティング、財務、AI研究などの様々な業界にPSI生産管理、在庫予測・最適化分析、顧客ロイヤルティ分析、センチメント分析、SaaS、PaaS、IaaS、AI at the Edge の環境構築などのスペシャリスト