Pulearnでの陽性のラベルとラベルなしデータの分類分析


 

目次

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 の環境構築などのスペシャリスト