2017-03-12 7 views
1

私は、私のデータセットのクラスター構造を悪用することを目指すプロジェクトに取り組んでいます。 Iはscikit-leanrのK-means法の実装を使用して自分のデータをクラスタ化するために、次のコード、Xを使用する:無作為に各クラスターのx%をサンプリングします

k = KMeans(n_clusters=(i+2), precompute_distances=True,).fit(X) 
df = pd.DataFrame({'cluster' : k.labels_, 'percentage posotive' : y}) 
a = df.groupby('cluster').apply(lambda cluster:cluster.sum()/cluster.count()) 

2つのクラスが(0で示される)は、正(1で表される)と負であり、中に格納されています配列y。 このコードは最初にXをクラスタリングし、データフレームに各クラスタ番号とその中の肯定的なインスタンスの割合の数を格納します。

ここで、15%のサンプリングをするまで、各クラスタからランダムにポイントを選択します。これどうやってするの?

ここで要求されたように、テストデータセットを含む簡略化されたスクリプトです:

from sklearn.cluster import KMeans 
import pandas as pd 
X = [[1,2], [2,5], [1,2], [3,3], [1,2], [7,3], [1,1], [2,19], [1,11], [54,3], [78,2], [74,36]] 
y = [0,0,0,0,0,0,0,0,0,1,0,0] 
k = KMeans(n_clusters=(4), precompute_distances=True,).fit(X) 
df = pd.DataFrame({'cluster' : k.labels_, 'percentage posotive' : y}) 
a = df.groupby('cluster').apply(lambda cluster:cluster.sum()/cluster.count()) 
print(a) 

注:実際のデータセットデータ・インスタンスの機能と、数千、数千からなるはるかに大きいです。 @SandipanDeyに対応して

私はあまりあなたを伝えることはできませんが、基本的に我々は非常にアンバランスなデータセット(1:10,000)を扱っていると我々は少数クラスの例を識別にのみ関心があります要求されたラベルの数を減らしながらリコール> 95%である。 (リコールは医療に関連するものほど高くする必要があります)

少数派の例は一緒に集まり、肯定的な例を含むクラスタには通常少なくとも%%が含まれるため、x%をサンプリングすることによって、正のインスタンスを持つクラスタ。そのため、潜在的なポジティブなデータセットのサイズをすばやく減らすことができます。この胸像データセットは、アクティブな学習に使用できます。我々のアプローチは緩く私が正しくあなたを理解している場合、次のコードは、目的を果たす必要がある'Hierarchical Sampling for Active Learning'

+0

あなたは1と負の関係にあるとは思わないと思います。とにかく、これを行うための(小さな)サンプルデータセットを投稿しますか? – Denziloe

+1

@Denziloe良いキャッチ、それに応じて編集しました。すぐに小さなテストデータセットを追加します。 – scutnex

+0

@Denziloeテストデータセットを追加しました。 – scutnex

答えて

1

に触発さ:

import numpy as np 

# For each cluster 
# (1) Find all the points from X that are assigned to the cluster. 
# (2) Choose x% from those points randomly. 

n_clusters = 4 
x = 0.15 # percentage 

for i in range(n_clusters): 

    # (1) indices of all the points from X that belong to cluster i 
    C_i = np.where(k.labels_ == i)[0].tolist() 
    n_i = len(C_i) # number of points in cluster i 

    # (2) indices of the points from X to be sampled from cluster i 
    sample_i = np.random.choice(C_i, int(x * n_i)) 
    print i, sample_i 

ただ、好奇心のために、どのように能動的学習のためにこれらのx%ポイントを使用するつもりですか?

+1

ありがとう!アプローチの簡単な説明を提供しました – scutnex

+0

非常に説明を追加するための@非常に感謝、本当に感謝します。 –

関連する問題