2016-06-29 9 views
-1

私は以下のpandas DataFrameを持っています。パンダのデータフレーム:マシンラーニングなしで値ごとにグループをクラスタリングする方法は?

import pandas as pd 
df = pd.read_csv('filename.csv') 

print(df) 

     A  B   C   D 
0  2  0   11   0.053095 
1  2  0   11   0.059815 
2  0  35  11   0.055268 
3  0  35  11   0.054573 
4  0  1   11   0.054081 
5  0  2   11   0.054426 
6  0  1   11   0.054426 
7  0  1   11   0.054426 
8  42  7   3   0.048208 
9  42  7   3   0.050765 
10 42  7   3   0.05325 

    .... 

問題は、データが当然グループに「クラスタ化」されていることですが、このデータは指定されていません。上記から、行0-1は1つのグループであり、行2〜3はグループであり、行4〜7はグループであり、8〜10はグループです。

私はこの情報を転嫁する必要があります。マシン学習を使うことができます。しかし、パンダだけを使ってこれを行うことは可能ですか?

ユーザーはこれらのグループを作成するために列の値をグループ化できますか?問題は、値が正確なではないということです。第3グループの列Bには、グループ1,2,1,1があります。

答えて

1

純粋なパンダソリューションは、値が互いに近く、ビンサイズがクラスタの変動に対して十分に大きいものの、小さいクラスタ値間の距離よりも大きくなります。その答えはあなたのデータによって異なります。

ビニング手法では、パンダのcut関数を使用します。あなたは一連の(または配列)と、関数に必要なビンの数を指定します。この関数は、系列の範囲を指定された数のビンに均等に細分し、入力内の各値がどこにあるかを決定します。下の列の出力は、元の列車の考え方に従って、値がどのbinに入っていて、どのグループに分類できるかが表示されます。

これはサイズ〜5のビンのために実際に出てくるような方法は、これが動作する可能性

for col in df.columns: 
    binned_name = col + '_binned' 
    num_bins = np.ceil(df[col].max()/5) 
    df[binned_name] = pd.cut(df[col],num_bins,labels=False) 
+0

です。しかし、私が正しく理解すれば、これは複数の列に適用する必要があります。最初の列にbin +/-を持つクラスタがあるかどうかを確認し、2番目の列などが存在するかどうかを確認します。 それ以外の場合は、1つのクラスタ内に複数のクラスタが存在する可能性があります。 – ShanZhengYang

+0

あなたのビンサイズが大きすぎる場合に起こります。あなたは1次元のシルエット係数を見つけるために最適化することができますが、その時点でk-meansを使ってデータの多次元性を尊重する方が良いでしょう。 この回答はクラスタにgroupbyを使用する条件を満たしているため、これは列のフィーチャエンジニアリングの方法です。 – breucopter

+0

ビンサイズ+/- 1を使用します。グループ行2-3とグループ行4-7は、2つのグループにクラスター化されますか?列Aの値は同じですか? – ShanZhengYang

関連する問題