1. 程式人生 > >python+分類演算法

python+分類演算法

分類演算法:LR/RF/GBDT/ADABOOST

python包:sklearn

# -*- coding: utf-8 -*-
"""
Created on Wed May  9 10:37:12 2018

比較不同分類演算法效果

分類演算法:LR/RF/GBDT/ADABOOST

@author: DELL
"""

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
import pandas as pd
import numpy as np

# 讀入資料,資料格式為 user,feature,pv,label
data = pd.read_csv('E:\\creditCard\\rf_data\\train_500.csv') # 正樣本資料
data1 = pd.read_csv('E:\\creditCard\\rf_data\\train_1w.csv') # 負樣本資料
data = data.append(data1) # 合併

# 整理資料,將資料整理成 使用者-特徵 矩陣
grp=data.groupby(['user','feature'])
grp_1 = grp.agg(np.sum) # pv 累加
grp_2 = grp_1.reset_index() # 重置行索引
grp_3 = grp_2.pivot_table(index='user',columns='feature',values='pv') # 以使用者為行索引,特徵為列索引,pv為矩陣內容
grp_4 = grp_3.fillna(0) # 將na替換成0

# 獲取所有特徵名稱
features = grp_4.columns

# 將資料整理成 使用者-標籤 矩陣
user_label_1 = data[['user','label']].groupby(['user']).agg('max') # 標籤為"y"或"n",當用戶分組後,取較大值作為標籤
# 將標籤列加入 使用者-特徵 矩陣
grp_4['label'] = user_label_1['label']

# 劃分訓練集和測試集,隨機劃分,75%為訓練集
grp_4['is_train'] = np.random.uniform(0,1,len(grp_4)) <=0.75 # 生成0-1的隨機數,按0.75劃分
train,test = grp_4[grp_4['is_train']==True],grp_4[grp_4['is_train']==False] # 拆分測試集和訓練集

# 邏輯迴歸
lr = LogisticRegression(random_state=10)
lr.fit(train[features],train['label']) # 訓練模型
label_predict1 = lr.predict(test[features]) # 預測測試集分類
result1 = pd.crosstab(test['label'],label_predict1) # 生成真實標籤-預測標籤矩陣
print("lr")
print(result1)
print("") 

# 隨機森林
clf = RandomForestClassifier(n_jobs=2,n_estimators=10)
clf.fit(train[features],train['label'])
label_predict2 = clf.predict(test[features])
result2 = pd.crosstab(test['label'],label_predict2)
print("randomforst")
print(result2)
print("")

# GBDT
gbc = GradientBoostingClassifier(random_state=10)
gbc.fit(train[features],train['label'])
label_predict3 = gbc.predict(test[features])
result3 = pd.crosstab(test['label'],label_predict3)
print("gbdt")
print(result3)
print("")

# adaboost
abc = AdaBoostClassifier()
abc.fit(train[features],train['label'])
label_predict4 = abc.predict(test[features])
result4 = pd.crosstab(test['label'],label_predict4)
print("adaboost")
print(result4)

# 將 分類錯誤的負樣本使用者 輸出到檔案
f = open('E:\\creditCard\\rf_data\\user2\\user_nf.csv','w');
test["pre"]=label_predictpreusers=test[(test["pre"]=='y')&(test['label']=='n')]
for i in preusers.index:
    f.write(i+"\n")
f.close();
print("finished!!!")
結果:

runfile('D:/pythonspace/randomForst/lr_userfilter.py', wdir='D:/pythonspace/randomForst')
lr
col_0      n   y
label           
n      13280  20
y         66  94

randomforst
col_0      n    y
label            
n      13292    8
y         56  104

gbdt
col_0      n    y
label            
n      13285   15
y         57  103

adaboost
col_0      n    y
label            
n      13284   16
y         57  103