2017-09-12 2 views
1

Kaggle (link)의 신용 카드 사기 데이터 세트 작업을 시도하면서 나는 더 나은 모델을 가질 수 있다는 것을 알았습니다. 훈련을위한 데이터 세트. 단지 데이터 세트를 설명하기 위해 31 개 기능의 284807 레코드로 구성됩니다. 이 데이터 세트에는 단지 492 건의 사기 (단지 0.17 %)가 있습니다.데이터 세트를 줄여서 PCA 분해율을 높이는 것이 좋습니다.

필자는 전체 데이터 세트에서 PCA를 수행하여 가장 중요한 세 가지 차원 만 표시하려고 시도했습니다. 그 중 하나는 사기의 여부를 결정하는 패턴을 발견하는 것은 불가능이 하나에서

PCA with full dataset

: 결과는 다음 중 하나입니다. 내가 비 사기에만 비율 (사기/non_fraud)를 증가의 데이터 집합을 줄이면

이 내가 같은 플롯

PCA_100000

PCA_10000

PCA_1000

과 함께하는 것입니다

더 나은 분해를 위해 감소 된 데이터 세트에 PCA를 맞추는 것이 이치에 맞는지 모르겠습니다. 예를 들어 100,000 포인트의 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

을 그것은 의미가 확실히 : 당신이 그것을 시도하려는 경우

는 코드입니다.

사용중인 기술은 일반적으로 Random Undersampling으로 알려져 있으며 ML에서는 불균형 데이터 문제 (예 : 설명하는 것과 같은)를 처리 할 때 일반적으로 유용합니다. 자세한 내용은 Wikipedia page을 참조하십시오.

물론 클래스 불균형을 처리하는 다른 많은 방법이 있지만이 클래스의 아름다움은 매우 간단하고 때로는 매우 효과적이라는 것입니다.

+0

이 답변에 많은 감사드립니다! 배울 것이 너무 많습니다. 그리고 이것은 확실히 좋은 것입니다. –

관련 문제