xgboost實現

def draw_result(filename):
    import numpy as np
    from scipy import interp
    import matplotlib.pyplot as plt
    from matplotlib.pyplot import savefig

    import xgboost as xgb
    from sklearn.cross_validation import train_test_split
    from sklearn.cross_validation import cross_val_score
    from sklearn import cross_validation
    from sklearn.metrics import roc_curve, auc
    from sklearn.cross_validation import StratifiedKFold

    %pylab inline
    matplotlib.style.use('ggplot')
    
    # setup parameters for xgboost
    param = {}
    # use softmax multi-class classification
    param['objective'] = 'binary:logistic'              #多分類:'multi:softprob'
#     param['eval_metric '] = 'auc' #校驗數據所需要的評價指標
    param['eta'] = 0.03  #通常最後設置eta爲0.01~0.2
#     param['min_child_weight']=0.5 #孩子節點中最小的樣本權重和。如果一個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。
#     param['alpha '] =0 #默認0,L1正則懲罰係數,當數據維度極高時可以使用,使得算法運行更快。
#     param['lambda '] =0 #默認0,L2 正則的懲罰係數
#     param['scale_pos_weight'] = 0 #默認0,大於0的取值可以處理類別不平衡的情況。幫助模型更快收斂
    param['max_depth'] = 6  #通常取值:3-10
#     param['colsample_bytree '] =1 #默認爲1,在建立樹時對特徵隨機採樣的比例。
#     param['subsample']=1 #默認爲1,用於訓練模型的子樣本佔整個樣本集合的比例。
#     param['max_delta_step']=3  #通常不需要設置這個值,但在使用logistics 迴歸時,若類別極度不平衡,則調整該參數可能有效果
    param['silent'] = 1  #取0時表示打印出運行時信息,取1時表示以緘默方式運行,不打印運行時的信息。
#     param['nthread'] = 4  #如果你希望以最大速度運行,建議不設置這個參數,模型將自動獲得最大線程
#     param['num_class'] = 2  #多分類時需設置

    num_round = 300  #提升迭代的個數

    try:
        import cPickle as pickle
    except:
        import pickle

#從.npz文件中加載數據
    with np.load(filename) as data:
        positive = data['positiveSample']
        negative = data['negSample']
    X = np.concatenate((positive,negative))

    y1 = np.ones((len(positive),1))
    y2 = np.zeros((len(negative),1))
    y = []
    for i in range(len(positive)):
        y.append(1)
    for i in range(len(negative)):
        y.append(0) 
    y=np.array(y)
    # Classification and ROC analysis
    #分類,做ROC分析

    # Run classifier with cross-validation and plot ROC curves
    #使用6折交叉驗證,並且畫ROC曲線
    cv = StratifiedKFold(y, n_folds=6)

    mean_tpr = 0.0
    mean_fpr = np.linspace(0, 1, 100)
    all_tpr = []
    
    for i, (train, test) in enumerate(cv):
        xg_train = xgb.DMatrix( X[train], label=y[train])
        xg_test = xgb.DMatrix(X[test], label=y[test])
        watchlist = [ (xg_train,'train'), (xg_test, 'test') ]
        bst = xgb.train(param, xg_train, num_round, watchlist)  #,early_stopping_rounds=100
        
        probas_ = bst.predict( xg_test )
#         ylabel = np.argmax(probas_, axis=1)
        
        fpr, tpr, thresholds = roc_curve(y[test], probas_)  #probas_[:, 1]
        mean_tpr += interp(mean_fpr, fpr, tpr)			#對mean_tpr在mean_fpr處進行插值,通過scipy包調用interp()函數
        mean_tpr[0] = 0.0 								#初始處爲0
        roc_auc = auc(fpr, tpr)
        #畫圖,只需要plt.plot(fpr,tpr),變量roc_auc只是記錄auc的值,通過auc()函數能計算出來
        plt.plot(fpr, tpr, lw=1, label='ROC fold %d (area = %0.6f)' % (i, roc_auc))

    #畫對角線
    plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck')

    mean_tpr /= len(cv) 					#在mean_fpr100個點,每個點處插值插值多次取平均
    mean_tpr[-1] = 1.0 						#座標最後一個點爲(1,1)
    mean_auc = auc(mean_fpr, mean_tpr)		#計算平均AUC值
    #畫平均ROC曲線
    plt.plot(mean_fpr, mean_tpr, 'k--',label='Mean ROC (area = %0.6f)' % mean_auc, lw=2)

    plt.xlim([-0.05, 1.05])
    plt.ylim([-0.05, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.legend(loc="lower right")
    plt.savefig('data/mimic3.jpg',dpi=600)  #保存圖片
    plt.show()
    

draw_result("file.npz") 

發佈了34 篇原創文章 · 獲贊 328 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章