第31步 机器学习分类实战:多轮建模

开始填坑之旅。

首先,之前提过,random_state这个参数,它的功能是确保每次随机抽样所得到的数据都是一样的,有利于数据的复现。比如,我们这十个ML模型,用的参数都是random_state=666,这样作比较才有可比性,因为训练集和验证集都是一样的,大家的起跑线一样,公平竞争。

我之前也也给大家示范过,random_state选取不同的数值,模型的性能是有差别的,这也可以解释,毕竟我们演示的数据集样本量也就1000多,属于小样本,而且数据内部肯定存在异质性,因此,不同抽样的数据所得出来的模型性能,自然不同。

举个不太恰当的例子:东部沿海的教育资源比西部地区要好,同一个人,受教育的地区不同,其学习成绩大概率也会不同。但是呢,从另一个角度来说,所谓是金子总会发光,考察一个人厉不厉害,是不是得把他放到不同地区考察一下,综合判断,毕竟有些人顺风英雄,逆风狗熊,有些人反过来。

所以,我觉得要综合判断一个模型好不好,一次随机抽样是不行的,得多次抽样建模,看看整体的性能如何才行(特别是对于这种小训练集)。

所以我的思路是,随机抽取训练集和验证集2000次(随你),然后构建2000个ML模型(譬如2000个朴素贝叶斯),得出2000批性能参数。那怎么实现呢,还不就是random_state,下面上代码,以朴素贝叶斯为例:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('X disease code fs.csv')
X = dataset.iloc[:, 1:14].values
Y = dataset.iloc[:, 0].values
empty = np.array([[0],[0],[0],[0],[0],[0],[0]])
n=1
while n < 2001:
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.30, random_state = n)
    from sklearn.preprocessing import StandardScaler
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    from sklearn.naive_bayes import GaussianNB
    classifier = GaussianNB() 
    classifier.fit(X_train, y_train)
    y_pred = classifier.predict(X_test)    
    y_updatapred = classifier.predict(X_train)
    from sklearn.metrics import confusion_matrix, roc_auc_score
    cm = confusion_matrix(y_test, y_pred)    
    cm_updata = confusion_matrix(y_train, y_updatapred)
    auc = roc_auc_score(y_test, y_pred)
    auc_updata = roc_auc_score(y_train, y_updatapred)
    a = cm[0,0]
    b = cm[0,1]
    c = cm[1,0]
    d = cm[1,1]
    sen = d/(d+c)
    sep = a/(a+b)
    a_updata = cm_updata[0,0]
    b_updata = cm_updata[0,1]
    c_updata = cm_updata[1,0]
    d_updata = cm_updata[1,1]
    sen_updata = d_updata/(d_updata + c_updata) 
    sep_updata = a_updata/(a_updata + b_updata)
    first = np.array([[n],[sen],[sep],[auc],[sen_updata],[sep_updata],[auc_updata]])
    second = np.hstack((empty,first))
    empty = second
    n = n + 1
    print(n)
final_par = np.delete(second,0,axis=1)
print (final_par)
final_parT = final_par.T
np.savetxt('jet_NB_par',final_parT,delimiter=',')

简单解说:

1.其实就是一个循环语句,while n < 2001,2000次就是2001,你要是想运行10000次,就改成10001;

2.运行以后呢,可以看到模型在迭代,显示的是运行到第几个模型了:

3. 然后,2000次模型参数的结果,存在一个叫final_parT的表格中,可以点击打开看看:

扫描二维码关注公众号,回复: 15130586 查看本文章

 一共七列,分别表示,验证集或者测试集的灵敏度、特异度、AUC,训练集的灵敏度、特异度、AUC。

4. 用代码np.savetxt('jet_NB_par',final_parT,delimiter=',')输出成excel查看,输出地址就是你的工作路径,E:\ML\100-Days-Of-ML-Code-master\datasets(比如我的)

5. 打开工作路径,可以发现jet_NB_par这个文件是白色的:

我们只需要给他加一个后缀,“.csv”就可以打开了:

 6. 打开文件,是科学计数法,调整一下格式,添加一个列名:

 7. 然后可以操作了,比如test-sen排个序,看看最好的有多好;比如看看2000次的平均值和标准差:AUC平均值0.77-0.78左右。剩下的自己玩了,不说那么多了,发挥你们的妄想空间。

猜你喜欢

转载自blog.csdn.net/qq_30452897/article/details/130548591
今日推荐