Python數據分析------例子1(信用卡欺詐)


1、讀取數據

data=read_csv(path)
data.head()

#畫圖(查看class即分類的數據條形圖),函數sort_index()是將dataframe按照行索引來排序輸出值
count_classes=pd.value_counts(data['Class'],sort=True).sort_index()
count_classes.plot(kind='bar')
plt.title("*****")
plt.xlable("class")
plt.ylable("Frequency")

2、認識數據

①數據特征的量綱差距(即歸一化/標准化處理)

from sklearn.processing import StanarScaler

#將特征'Amount'歸一化成新的特征'normAmount',這里的reshape函數是將dataframe轉化成array,fit_transform的參數需要是數組。
#fit_transform()是將數據fit再transform,主要作用是將數據標准化成均值為0,方差為1的數,范圍在【-1,1】之間。
data['normAmount']=StandarScaler().fit_transform(data['Amount'].reshape(-1,1)) #將沒有用的數據特征刪除 data=data.drop('Amount','time')

②數據分布不均衡(比方說分類,0-1分類,0的數據遠遠大於1的數據)

處理方式:下采樣、過采樣

下采樣:將多的數據變得和少的數據一樣少。

過采樣:將少的數據變得和多的數據一樣多。

以下是下采樣:

 
#下采樣
#將dataframe分為X和Y,其中不等於Class屬性的為X,將屬性值Class作為Y
X=data.ix[:,data.columns!='Class']
y=data.ix[:,data.columns=='Class']

#少的數據數量確定為number_fraud,也就是隨機采樣的數量。
number_fraud = len(data[data.Class == 1])
#少的數據的索引,轉化成array形式,這樣方便多的數據采樣后的索引進行合並。用函數np.concatenate
fraud_indices = np.array(data[data.Class == 1].index)

#多的數據索引
normal_indices = data[data.Class == 0].index

#random中的choice函數,第一個參數就是要采樣的數據,第二個參數是采樣量,第三個是沒有重復替換的數據
random_normal_indices = np.random.choice(normal_indices, number_records_fraud, replace = False)
random_normal_indices = np.array(random_normal_indices)

#合並采樣后的多數據和少的數據的索引
under_sample_indices = np.concatenate([fraud_indices,random_normal_indices])

#根據合並后的索引來取數據
under_sample_data = data.iloc[under_sample_indices,:]

X_undersample = under_sample_data.ix[:, under_sample_data.columns != 'Class']
y_undersample = under_sample_data.ix[:, under_sample_data.columns == 'Class']

 過采樣:SMOTE算法、ADASYN算法

SMOTE:對於少數類樣本a,隨機選擇一個最近鄰的樣本b,然后從a和b的連線上隨機選取一個點c作為新的少數類樣本。

計算步驟:

(1)對於少數類中每一個樣本x,以歐氏距離為標准計算它到少數類樣本集中所有樣本的距離,得到其k近鄰。

(2)根據樣本不平衡比例設置一個采樣比例以確定采樣倍率N,對於每一個少數類樣本x,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為xn。

(3)對於每一個隨機選出的近鄰xn,分別與原樣本按照如下的公式構建新的樣本。

X(new)=x+rand(0,1)×(^x-x) 【^x為均值】

比如:我要將少數類樣本數量增大5倍,則N=5,選出x的5近鄰,計算它的均值^x,再計算其與x的距離取隨機值。

代碼如下:

#引入不平衡類模塊的上采樣
from imblearn.over_sampling import SMOTE

#
oversampler=SMOTE(random_state=0)
X,Y=oversampler.fit_sample(X_train,Y_train)

 

ADASYN:關注的是在那些基於K最近鄰分類器被錯誤分類的原始樣本附近生成新的少數類樣本

 

③缺失值、異常值

3、預處理

①交叉驗證:切分訓練集合測試集。

from sklearn.cross_validation import train_test_split

#整個數據集的切分【作為后面預測的時候用的數據】
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)

# 下采樣數據集的切分
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_undersample
                                                                                                   ,y_undersample
                                                                                                   ,test_size = 0.3
                                                                                                   ,random_state = 0)

4、模型評估(如用召回率來評估)recall=TP/(TP+FN)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM