2017-09-12 7 views
1

Kaggle(link)のクレジットカード詐欺データセットを処理しようとしているうちに、私はより良いモデルを得ることができました。トレーニングのためのデータセット。説明するだけで、データセットは31個の機能の284807個のレコードで構成されています。このデータセットにはわずか492件の詐欺があります(わずか0.17%)。より良いPCA分解を行うためにデータセットを減らすことはよい習慣です

私は、3つの最も重要なディメンションだけを表示できるように、完全なデータセットでPCAを実行しようとしました。それはどちらか、それは詐欺だかいないかを決定するためのパターンを見つけることは不可能だが、この一

PCA with full dataset

:結果は以下のものです。

私は非詐欺のデータセットを減らす場合のみ比(詐欺/ non_fraud)を高めるために、これは私が同じプロット

PCA_100000

PCA_10000

PCA_1000

を持っているものです

ここで、より良い分解を行うために、削減されたデータセットにPCAを適合させることが理にかなっているかどうかはわかりません。たとえば、100000ポイントのPCAを使用すると、PCA1> 5のすべてのエントリが不正であると言えるでしょう。

あなたはそれを試してみたい場合、これはコードです:あなたの助けのための

dataset = pd.read_csv("creditcard.csv") 
sample_size = 284807-492 # between 1 and 284807-492 
a = dataset[dataset["Class"] == 1] # always keep all frauds 
b = dataset[dataset["Class"] == 0].sample(sample_size) # reduce non fraud qty 

dataset = pd.concat([a, b]).sample(frac=1) # concat with a shuffle 

# Scaling of features for the PCA 
y = dataset["Class"] 
X = dataset.drop("Class", axis=1) 
X_scale = StandardScaler().fit_transform(X) 

# Doing PCA on the dataset 
pca = PCA(n_components=3) 
X_pca = pca.fit_transform(X_scale) 

pca1, pca2, pca3, c = X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], y 
plt.scatter(pca1, pca2, s=pca3, c=y) 
plt.xlabel("PCA1") 
plt.ylabel("PCA2") 
plt.title("{}-points".format(sample_size)) 
# plt.savefig("{}-points".format(sample_size), dpi=600) 

おかげで、

答えて

4

それは間違いなく、理にかなっています。

あなたが使用しているテクニックは、通常、ランダムアンダーサンプリングと呼ばれ、MLでは、不均衡なデータの問題(説明しているものなど)を扱うときに一般的に便利です。あなたはそれについて詳細を見ることができますWikipedia page

もちろん、クラスの不均衡を処理する他の多くの方法がありますが、この1つの美しさは、それが非常に単純で、時には本当に効果的であるということです。

+0

この回答に感謝します。学ぶべきことがたくさんあり、これは間違いなく良いことです –

関連する問題