利用python實現(xiàn)對csv,arff,libsvm特征文件的導(dǎo)入,同時實現(xiàn)svm+f-score特征選擇

使用方法

使用python語言實現(xiàn)對于支持向量機(SVM)特征選擇的實現(xiàn)汁咏,特征選擇算法為f-score,該程序的主要有點是可輸入文件囊括了csv,libsvm,arff等在序列分類的機器學(xué)習(xí)領(lǐng)域常用到的格式哎壳,其中csv:最后一列為class,libsvm:第一列為class,arff:通常最后一列為類別扎酷,其中csv和libsvm中不存在開頭咏瑟,直接是使用的數(shù)據(jù)拂到。
python train.py -i 1.csv,2.csv,3.libsvm,4.arff -c 5

  • 其中train.py為程序名稱
  • -i :后面接文件名,可以為csv,libsvm,arff格式码泞,多個文件也可以用兄旬,但建議不要,因為特征選擇時間通常很長
  • -c:后面5代表五折交叉驗證
    #!/usr/bin/env python
# encoding:utf-8
import os
import sys
import getopt
import threading
import pandas as pd
import math
import numpy as np
from time import clock
from sklearn.feature_selection import  f_classif
from sklearn.externals.joblib import Memory
from sklearn import  metrics
import easy_excel

import itertools
from sklearn.model_selection import KFold  
from sklearn import svm
from sklearn.model_selection import train_test_split
import math
from xgboost import XGBClassifier
from sklearn.neighbors import KNeighborsClassifier
import easy_excel
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import *
import sklearn.ensemble
from sklearn.externals import joblib
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.metrics import roc_curve, auc
import sys
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB  
import subprocess
from sklearn.utils import shuffle
import itertools
from sklearn.ensemble import GradientBoostingClassifier
import sys
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC, LinearSVC
from sklearn.naive_bayes import BernoulliNB
from sklearn.datasets import load_svmlight_file
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import SGDClassifier, LogisticRegression
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, \
    BaggingClassifier, ExtraTreesClassifier, GradientBoostingClassifier

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


mem = Memory("./mycache")
@mem.cache
def get_data(file_name):
    data = load_svmlight_file(file_name)
    return data[0], data[1]


def csv_and_arff2svm(arff_files):
    svm_files = []
    for arff_file in arff_files:
        name = arff_file[0: arff_file.rindex('.')]
        tpe = arff_file[arff_file.rindex('.')+1:]
        svm_file = name+".libsvm"
        svm_files.append(svm_file)
        if tpe == "arff":
            if os.path.exists(svm_file):
                pass
            else:
                f = open(arff_file)
                w = open(svm_file, 'w')
                flag = False
                for line in f.readlines():
                    if flag:
                        if line.strip() == '':
                            continue
                        temp = line.strip('\n').strip('\r').split(',')
                        w.write(temp[len(temp)-1])
                        for i in range(len(temp)-1):
                            w.write(' '+str(i+1)+':'+str(temp[i]))
                        w.write('\n')
                    else:
                        line = line.upper()
                        if line.startswith('@DATA') or flag:
                            flag = True
                f.close()
                w.close()
        elif tpe == "csv":
            if os.path.exists(svm_file):
                pass
            else:
                f = open(arff_file)
                w = open(svm_file, 'w')
                for line in f.readlines():
                    if line.strip() == '':
                        continue
                    temp = line.strip('\n').strip('\r').split(',')
                    w.write(temp[len(temp)-1])
                    for i in range(len(temp)-1):
                        w.write(' '+str(i+1)+':'+str(temp[i]))
                    w.write('\n')
                f.close()
                w.close()
        elif tpe == "libsvm":
            continue
        else:
            print "File format error! Arff and libsvm are passed."
            sys.exit()
    return svm_files
opts, args = getopt.getopt(sys.argv[1:], "hi:c:t:o:s:m:", )
for op, value in opts:
    if op == "-i":
        input_files = str(value)
        input_files = input_files.replace(" ", "").split(',')
        for input_file in input_files:
            if input_file == "":
                print "Warning: please insure no blank in your input files !"
                sys.exit()
    elif op == "-c":
        cv = int(value)
if __name__ =="__main__":
    path=""
    outputname="svm_f-score"
    name=outputname
    print '*** Validating file format ...'
    input_files = csv_and_arff2svm(input_files)
    for input_file in input_files:
        # 導(dǎo)入原始數(shù)據(jù)
        X, Y = get_data(input_file)
        train_data = X.todense()
        train_data=np.array(train_data)
        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_]
        with open("all_dimension_results.txt",'a') as f:
                f.write(str(F_sort_value)+"\n")
        print F_sort_value
        with open("all_dimension_results.txt",'a') as f:
                f.write(str(selected_list_)+"\n")
        print selected_list_
        bestACC=0
        bestC=0
        bestgamma=0
        best_dimension=0
        all_dimension_results=[]
        for select_num in xrange(1,len(train_data[0])+1):
            train_data2=train_data
            print np.array(train_data).shape
            print np.array(train_data2).shape
            selected_list_2=selected_list_[xrange(select_num)]
            X_train=pd.DataFrame(train_data2)
            X_train=X_train.iloc[:,selected_list_2]
            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=cv, n_jobs=2, scoring='accuracy')
            clf.fit(X, Y)
            C=clf.best_params_['C']
            joblib.dump(clf,path+outputname+str(select_num)+".model")
            gamma=clf.best_params_['gamma']
            y_predict=cross_val_predict(svm.SVC(kernel='rbf',C=C,gamma=gamma),X,Y,cv=cv,n_jobs=2)
            y_predict_prob=cross_val_predict(svm.SVC(kernel='rbf',C=C,gamma=gamma,probability=True),X,Y,cv=cv,n_jobs=2,method='predict_proba')
            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+outputname+"_"+'_predict_crossvalidation.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=[[['svm'+"C:"+str(C)+"gamma:"+str(gamma),ACC,precision, recall,SN, SP, GM,F_measure,F1_Score,MCC,ROC_AUC_area,TP,FN,FP,TN,pos,neg]]]
            if ACC>bestACC:
                bestACC=ACC
                bestgamma=gamma
                bestC=C
                best_dimension=X.shape[1]
            print savedata
            print X.shape[1]
            with open("all_dimension_results.txt",'a') as f:
                f.write(str(savedata)+"\n")
            all_dimension_results.append(savedata)
        print bestACC
        print bestC
        print bestgamma
        print best_dimension
        easy_excel.save("svm_crossvalidation",[str(X.shape[1])],savedata,path+'cross_validation_'+name+'.xls')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末余寥,一起剝皮案震驚了整個濱河市领铐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宋舷,老刑警劉巖罐孝,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肥缔,居然都是意外死亡莲兢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門续膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改艇,“玉大人,你說我怎么就攤上這事坟岔≮诵郑” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵社付,是天一觀的道長承疲。 經(jīng)常有香客問我,道長鸥咖,這世上最難降的妖魔是什么燕鸽? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮啼辣,結(jié)果婚禮上啊研,老公的妹妹穿的比我還像新娘。我一直安慰自己鸥拧,他們只是感情好党远,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著富弦,像睡著了一般沟娱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腕柜,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天济似,我揣著相機與錄音柳爽,去河邊找鬼。 笑死碱屁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛾找。 我是一名探鬼主播娩脾,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼打毛!你這毒婦竟也來了柿赊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤幻枉,失蹤者是張志新(化名)和其女友劉穎碰声,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熬甫,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胰挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椿肩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞻颂。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郑象,靈堂內(nèi)的尸體忽然破棺而出贡这,到底是詐尸還是另有隱情,我是刑警寧澤厂榛,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布盖矫,位于F島的核電站,受9級特大地震影響击奶,放射性物質(zhì)發(fā)生泄漏辈双。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一柜砾、第九天 我趴在偏房一處隱蔽的房頂上張望辐马。 院中可真熱鬧,春花似錦局义、人聲如沸喜爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩帐。三九已至,卻和暖如春另萤,著一層夾襖步出監(jiān)牢的瞬間湃密,已是汗流浹背诅挑。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泛源,地道東北人拔妥。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像达箍,于是被迫代替她去往敵國和親没龙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容