f-score+svm特征选择过程pipeline


# coding: utf-8

# In[ ]:


# !/use/bin/env python

import pandas as pd
import numpy as np
import itertools
from sklearn.model_selection import KFold  
from sklearn import svm
from sklearn.model_selection import train_test_split
import math
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import *
import sklearn.ensemble
from sklearn import metrics
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import GridSearchCV
from sklearn.utils import shuffle
import itertools
import sys
from sklearn.feature_selection import  f_classif
import warnings
from sklearn.externals import joblib
warnings.filterwarnings('ignore')
path=""
inputname=sys.argv[1]
outputname=sys.argv[2].split(".")[0]
name=outputname
cross_times=sys.argv[3]
cpu_values=sys.argv[4]
distance=sys.argv[5]

# inputname="test.csv"
# outputname="test_2RFH"
# name=outputname
# cross_times=2
# cpu_values=12
# distance=10


# In[ ]:


def performance(labelArr, predictArr):
    #labelArr[i] is actual value,predictArr[i] is predict value
    TP = 0.; TN = 0.; FP = 0.; FN = 0.
    for i in range(len(labelArr)):
        if labelArr[i] == 1 and predictArr[i] == 1:
            TP += 1.
        if labelArr[i] == 1 and predictArr[i] == 0:
            FN += 1.
        if labelArr[i] == 0 and predictArr[i] == 1:
            FP += 1.
        if labelArr[i] == 0 and predictArr[i] == 0:
            TN += 1.
    if (TP + FN)==0:
        SN=0
    else:
        SN = TP/(TP + FN) #Sensitivity = TP/P  and P = TP + FN
    if (FP+TN)==0:
        SP=0
    else:
        SP = TN/(FP + TN) #Specificity = TN/N  and N = TN + FP
    if (TP+FP)==0:
        precision=0
    else:
        precision=TP/(TP+FP)
    if (TP+FN)==0:
        recall=0
    else:
        recall=TP/(TP+FN)
    GM=math.sqrt(recall*SP)
    #MCC = (TP*TN-FP*FN)/math.sqrt((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN))
    return precision,recall,SN,SP,GM,TP,TN,FP,FN


# In[ ]:


"""
    cross validation and f-score and xgboost
"""
datapath =path+inputname
classifier="svm_f-score"
mode="crossvalidation"
print("start")
train_data = pd.read_csv(datapath, header=None, index_col=None)
Y = list(map(lambda x: 1, xrange(len(train_data) // 2)))
Y2 = list(map(lambda x: 0, xrange(len(train_data) // 2)))
Y.extend(Y2)
Y = np.array(Y)
F, pval = f_classif(train_data, Y)
idx = np.argsort(F)
selected_list_=idx[::-1]
F_sort_value=[F[e] for e in selected_list_]

print(F_sort_value)
print(selected_list_)

feature_dimension_and_scores=[]
feature_dimension_and_scores.append(F_sort_value)
feature_dimension_and_scores.append(selected_list_)

feature_dimension_and_scores=np.array(feature_dimension_and_scores).T

pd.DataFrame(feature_dimension_and_scores).to_excel("feature_dimension_and_score.xlsx",index=False,header=["score","dimension"])

print("After filtering Nan and inf")
selected_list_=[a  for a,b in zip(selected_list_,F_sort_value) if (not math.isnan(b) and not math.isinf(b))]
print(selected_list_)


bestACC=0
bestC=0
bestgamma=0
best_dimension=0
row0 = [u'特征集', u'样本个数', u'分类器', u'Accuracy', u'Precision', u'Recall', u'SN', u'SP',
                    u'Gm', u'F_measure', u'F_score', u'MCC', u'ROC曲线面积', u'tp', u'fn', u'fp', u'tn']
all_dimension_results=[]
all_dimension_results.append(row0)
select_list=[]
best_savedata=""
prediction_probability=[]
prediction_probability.append(Y.astype(int))
for select_num,temp_data in enumerate(selected_list_):
    train_data2=train_data.values
    select_list.append(int(temp_data))
    if len(select_list)%distance==0 or len(select_list)==len(selected_list_):
        X_train=pd.DataFrame(train_data2)
        X_train=X_train.iloc[:,select_list]
        X = np.array(X_train)
        svc = svm.SVC()
        parameters = {'kernel': ['rbf'], 'C':map(lambda x:2**x,np.linspace(-2,5,7)), 'gamma':map(lambda x:2**x,np.linspace(-5,2,7))}
        clf = GridSearchCV(svc, parameters, cv=cross_times, n_jobs=cpu_values, scoring='accuracy')
        clf.fit(X, Y)
        C=clf.best_params_['C']
        gamma=clf.best_params_['gamma']
        print("the best C and gamma are:",C,gamma)
        y_predict=cross_val_predict(svm.SVC(kernel='rbf',C=C,gamma=gamma),X,Y,cv=cross_times,n_jobs=cpu_values)
        ROC_AUC_area=metrics.roc_auc_score(Y, y_predict)
        y_predict_prob=cross_val_predict(svm.SVC(kernel='rbf',C=C,gamma=gamma,probability=True),X,Y,cv=cross_times,n_jobs=cpu_values,method='predict_proba')
        prediction_probability.append(y_predict_prob[:,1])
#         predict_save=[Y.astype(int),y_predict.astype(int),y_predict_prob[:,1]]
#         predict_save=np.array(predict_save).T
#         pd.DataFrame(predict_save).to_csv(path+classifier+"_"+mode+"_"+outputname+"_"+'predict.csv',header=None,index=False)
        ROC_AUC_area=metrics.roc_auc_score(Y,y_predict)
        ACC=metrics.accuracy_score(Y,y_predict)
        precision, recall, SN, SP, GM, TP, TN, FP, FN = performance(Y, y_predict)
        F1_Score=metrics.f1_score(Y, y_predict)
        F_measure=F1_Score
        MCC=metrics.matthews_corrcoef(Y, y_predict)
        pos=TP+FN
        neg=FP+TN
        savedata=[str(select_num+1),"positive:"+str(pos)+","+"negative:"+str(neg),'svm',ACC,precision, recall,SN, SP, GM,F_measure,F1_Score,MCC,ROC_AUC_area,TP,FN,FP,TN]
        if ACC>bestACC:
            bestACC=ACC
            bestC=C
            bestgamma=gamma
            best_savedata=savedata
            best_dimension=X.shape[1]
        print savedata
        print X.shape[1]
        all_dimension_results.append(savedata)
print("bestACC",bestACC)
print("bestC",bestC)
print("bestgamma",bestgamma)
print("best_dimension",best_dimension)
print("all_useful_dimensions_number",len(all_dimension_results))
final_X=train_data.values
final_select_list=np.array(selected_list_)
final_select_list=final_select_list[range(best_dimension)]
final_X=pd.DataFrame(final_X)
final_X=final_X.iloc[:,list(final_select_list)]
clf=svm.SVC(kernel='rbf',C=bestC,gamma=bestgamma)
clf.fit(final_X,Y)
joblib.dump(clf,path+classifier+"_"+mode+"_"+outputname+"_"+'.model')

temp=range(1,len(all_dimension_results))
temp=[str(e) for e in temp]
prediction_probability_list=['labels']
prediction_probability_list.extend(temp)
prediction_probability=np.array(prediction_probability).T.tolist()
prediction_probability[:][0]=[int(e) for e in prediction_probability[:][0]]
pd.DataFrame(prediction_probability).to_csv(path+classifier+"_"+mode+"_"+outputname+"_"+'predict.csv',header=prediction_probability_list,index=False)
pd.DataFrame(all_dimension_results).to_excel(path+'cross_validation_'+classifier+"_"+outputname+'.xlsx',sheet_name="_crossvalidation",header=None,index=False)
pd.DataFrame(np.array(all_dimension_results)[[0,best_dimension/distance],:]).to_excel(path+'cross_validation_'+classifier+"_"+outputname+"_"+'best.xlsx',sheet_name="_crossvalidation",header=None,index=False)


example:

python f-score_svm.py input.csv outputname crossvalidation_values cpu_values distance

其中:

  • f-score_svm.py: 程序名字
  • input.csv: 输入文件,以csv结尾
  • outputname: 输出文件的标记
  • crossvalidation_values: 几折交叉验证,如十折交叉验证填:10
  • cpu+values: 多进程数,需要查清自己电脑有多少cpu,建议使用少于自己电脑cpu数的值,如有4个cpu, 可以填3
  • distance:特征选择过程的幅度,一般填1,不可为0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容