这个练习是让我们比较三种分类算法的性能,加上学习调试一些算法的参数。
详情请看注释:
代码中没有from sklearn import cross_validation,因为pycharm提示这个库在新版上sklearn已经被删掉了
from sklearn import datasets
from sklearn.model_selection import KFold
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import numpy as np
dataset = datasets.make_classification(n_samples=1000, n_features=10,
n_informative=2, n_redundant=2,
n_repeated=0, n_classes=2) #生成一堆数据,参数n_sample为样本数,生成的数据中 dataset[0]是数据,dataset[1]是label
kf = KFold(n_splits=10, shuffle=True) #分割数据集,分成10份,每份作为测试集时,其余9份作为训练集
acc = []
f1 = []
auc = []
for train, test in kf.split(dataset[0]):
clf = GaussianNB()
clf.fit(dataset[0][train], dataset[1][train]) #训练分类器
pred = clf.predict(dataset[0][test]) #测试分类器
acc.append(metrics.accuracy_score(dataset[1][test], pred)) #计算准确度、f1_score等
f1.append(metrics.f1_score(dataset[1][test], pred))
auc.append(metrics.roc_auc_score(dataset[1][test], pred))
print("Gaussian NB")
print("accuracy :", np.mean(acc))
print("f1_score :", np.mean(f1))
print("auc_roc: ", np.mean(auc))
C_value = [1e-02, 1e-01, 1, 1e01, 1e02] #参数
acc = []
f1 = []
auc = []
for value in C_value: #在SVM中尝试每一个参数
for train, test in kf.split(dataset[0]):
clf = SVC(C=value, kernel='rbf', gamma=0.1)
clf.fit(dataset[0][train], dataset[1][train]) #训练分类器
pred = clf.predict(dataset[0][test]) #测试分类器
acc.append(metrics.accuracy_score(dataset[1][test], pred)) #计算准确度等
f1.append(metrics.f1_score(dataset[1][test], pred))
auc.append(metrics.roc_auc_score(dataset[1][test], pred))
print("SVC with C={}, kernel=rbf ".format(value))
print("accuracy :", np.mean(acc))
print("f1_score :", np.mean(f1))
print("auc_roc: ", np.mean(auc))
n_estimators = [10, 100, 1000]#参数
acc = []
f1 = []
auc = []
for value in n_estimators:#在random Forest中尝试各种参数
for train, test in kf.split(dataset[0]):
clf = RandomForestClassifier(n_estimators=value)
clf.fit(dataset[0][train], dataset[1][train])#训练分类器
pred = clf.predict(dataset[0][test]) #测试分类器
acc.append(metrics.accuracy_score(dataset[1][test], pred))#计算准确度等
f1.append(metrics.f1_score(dataset[1][test], pred))
auc.append(metrics.roc_auc_score(dataset[1][test], pred))
print("RandomForest with estimators num: {}".format(value))
print("accuracy :", np.mean(acc))
print("f1_score :", np.mean(f1))
print("auc_roc: ", np.mean(auc))
输出如下:
根据结果我们可以看出各个分类器的性能差异以及它们的参数对它们性能的影响
此次实验中效果最好的是