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)