用sklearn库中的算法对数据集进行训练和auc评估(个人学习笔记)

本文为个人学习笔记,仅供学习参考,欢迎讨论,要是有哪里写的不对或有疑问的欢迎讨论。

题目:运用已给数据集进行模型训练,使用逻辑回归、决策树、随机森林和AdaBoost几个算法进行训练,并打印各个算法训练后的auc评价指标。

1.导入数据集

用到的方法有:read_csv()、merge()、drop()、tolist()、train_test_split()

以下方法的详细参数和用法可使用**help(方法名)**的方法查看

①read_csv(): 读取数据并以某字符分隔。

常用参数:

filepath_or_buffer :放入要打开的文件地址或文件名(文件与py文件在同一文件夹下可直接用文件名调用)。可以是URL,常用URL类型有:http, ftp, s3, and file.

sep:以某个符号为分隔符。默认以’,’(逗号)为分隔。

compression(本例中没用到):打开文件后的压缩方式。默认为‘infer’。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。置为None则不解压。(可选参数有:‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None)

本题应用:

# 读取文件并以'\t'分割
# 此处"train_agg.csv"和"train_label.csv"均为文件名,我将该文件与我的py文件放入同一文件夹下了已经
data = pd.read_csv("train_agg.csv", sep="\t")
label = pd.read_csv("train_label.csv",sep="\t")

②merge(): 合并

Pandas 提供了多种将 Series、DataFrame 对象组合在一起的功能,用索引与关联代数功能的多种设置逻辑可执行连接(join)与合并(merge)操作。

常用参数:

left : DataFrame

right : DataFrame or named Series

how : 要执行的合并类型。(可选参数有:‘left’, ‘right’, ‘outer’, ‘inner’)默认为‘inner’

on :要加入的列或索引级别名称。这些必须在两个DataFrame中都可以找到。如果on为None且不合并索引,则默认为两个DataFrame中列的交集。

本题应用:

# 'USRID' 为文件中一个列的名称
data_label = data.merge(label, how="left", on="USRID")

③drop(): 删除行或列

常用形式(eg):

df.drop([“列名”],axis=1)

df.drop(columns=[“列名”])

常用参数:

axis : 是从索引(0或“索引”)还是从列(1或“列”)删除标签。(axis = 0 为行,axis = 1为列)

inplace : 默认为False。如果为True,则执行就地操作并返回None。

本题应用:

# 删除 'USRID' 这列
data_label.drop(['USRID'],axis = 1, inplace = True)

④tolist():将数组或矩阵转换为列表

本题应用:

# 将data_label的内容转换为列表方便遍历
columns = data_label.columns.tolist()

⑤train_test_split():从样本中随机的按比例选取train data和test data

所需头文件:

from sklearn.model_selection import train_test_split

常用参数:

train_data:所要划分的样本特征集

train_target:所要划分的样本结果

test_size:样本占比,如果是整数的话就是样本的数量

random_state:是随机数的种子。

stratify: 如果不是None,则将数据用作类标签以分层方式拆分。

本题应用:

return train_test_split(data_array, label_array, test_size=0.25, random_state=10,
                        stratify=label_array)

第一部分导入数据集整体代码:

def load_data():
    # 导入数据集
    data = pd.read_csv("train_agg.csv", sep="\t")
    label = pd.read_csv("train_label.csv",sep="\t")
    data_label = data.merge(label, how="left", on="USRID")
    
    # 得到训练集和测试集
    data_label.drop(['USRID'],axis = 1, inplace = True)
    columns = data_label.columns.tolist()
    # 遍历列表读取数据
    feature_columns = [i for i in columns if i != "FLAG"]
    # 将读取的内容数据放入data_array
    data_array = data_label[feature_columns].values
    # 将读取的标签数据放入label_array
    label_array = data_label['FLAG'].values
    # print(data_array)
    # print(label_array)
    return train_test_split(data_array, label_array, test_size=0.25, random_state=10,stratify=label_array)

2.用分类算法对数据集进行训练及测试

用到的分类算法有:朴素贝叶斯、逻辑回归、决策树、随机森林和AdaBoost。(本题中采用数据集较大故不适用KNN算法太慢了,若用iris数据集可用KNN进行测试)

①朴素贝叶斯算法:

头文件:

# sklearn库中引用朴素贝叶斯的头文件
from sklearn import naive_bayes
# 计算auc要用的头文件
from sklearn.metrics import roc_auc_score;

整体代码:

# 测试sklearn库中的bayes算法
def test_bayes(*data):
    # 导入X、Y的训练集和测试集数据
    X_train, X_test, y_train, y_test = data
    # 调用先验为高斯分布的朴素贝叶斯GaussianNB
    clf = naive_bayes.GaussianNB()
    # fit方法拟合数据
    clf.fit(X_train, y_train)
    print("bayes:training score:{:.4f}".format(clf.score(X_train, y_train)))
    print("bayes:testing score:{:.4f}".format(clf.score(X_test, y_test)))
    # predict_proba方法进行预测
    bayes_train_pre = clf.predict_proba(X_train)[:,1]
    bayes_test_pre = clf.predict_proba(X_test)[:,1]
    # roc_auc_score方法计算预测后的auc评价指标
    auc_train = roc_auc_score(y_train,bayes_train_pre)
    auc_test = roc_auc_score(y_test,bayes_test_pre)
    print("bayes_auc_train:", auc_train)
    print("bayes_auc_test:",auc_test)

在主函数中测试:

if __name__ == "__main__":
    X_train, X_test, y_train, y_test = load_data()
    test_bayes(X_train, X_test, y_train, y_test)
    # 输出一个分隔符(美观用)
    print("-" * 10)

②逻辑回归算法:

具体代码参照朴素贝叶斯算法,照着改就行了。

区别:调用的时候要调用sklearn库中逻辑回归的方法

头文件:

from sklearn import linear_model

调用方法:

# 参数solver不写也默认为liblinear
clf = linear_model.LogisticRegression(solver="liblinear")

solver参数注解:优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法)(详细参考:https://blog.csdn.net/kingzone_2008/article/details/81067036)

③决策树:

具体代码参照朴素贝叶斯算法,照着改就行了。

区别:调用的时候要调用sklearn库中决策树的方法

头文件:

from sklearn.tree import DecisionTreeClassifier

调用方法:

# 参数criterion置为"entropy"信息增益,max_depth置为5
clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)

(criterion参数注解:有两个参数"gini"和"entropy"。默认为"gini"。衡量分割质量的功能。支持的标准是“gini”代表gini杂质,“entropy(熵)”代表信息增益。)

(max_depth参数注解:树的最大深度。如果为None,则将节点扩展到所有叶子都是纯净的,或者直到所有叶子的含量少于min_samples_split个样本。默认为None)

④随机森林:

具体代码参照朴素贝叶斯算法,照着改就行了。

区别:调用的时候要调用sklearn库中随机森林的方法

头文件:

from sklearn.ensemble import RandomForestClassifier

调用方法:

# 参数n_estimators = 100,其余参数均参照上面提到过的注解
clf = RandomForestClassifier(n_estimators=100, max_depth=None, min_samples_split=2, random_state=0)

(n_estimators参数注解: 森林中树木的数量。整数。默认为100)

(max_depth同上决策树理解。min_samples_split:拆分内部节点所需的最少样本数,默认为2。random_state:随机数的种子,默认为None。 )

⑤AdaBoost算法:

(注意本题中AdaBoost算法预测速度较其余四个算法略慢一点)

具体代码参照朴素贝叶斯算法,照着改就行了。

区别:调用的时候要调用sklearn库中AdaBoost的方法

头文件:

from sklearn.ensemble import AdaBoostClassifier

调用方法:

# 参数n_estimators = 100,具体意义参照上面提过的注解
clf = AdaBoostClassifier(n_estimators=100)

⑥KNN算法(用iris训练集作为训练样本时可测试看看):

具体代码参照朴素贝叶斯算法,照着改就行了。

区别:调用的时候要调用sklearn库中KNN的方法

头文件:

from sklearn.neighbors import KNeighborsClassifier

调用方法:

# 参数n_neighbors置为5,默认也为5.(默认情况下用于'kneighbors'查询的邻居数。)
clf = KNeighborsClassifier(n_neighbors=5)

3.对代码进行迭代

我们通过第二部分可以发现不同的算法之间只需更改部分操作即可,所以我们可以对上面方法重复的部分进行一个封装。

# 封装重复部分
def clf_test(clf_name, clf, *data):
    # 导入X、Y的训练集和测试集数据
    X_train, X_test, y_train, y_test = data
    # fit方法拟合数据
    clf.fit(X_train, y_train)
    # predict_proba方法进行预测
    train_pre = clf.predict_proba(X_train)[:,1]
    test_pre = clf.predict_proba(X_test)[:,1]
    # roc_auc_score方法计算预测后的auc评价指标
    auc_train = roc_auc_score(y_train, train_pre)
    auc_test = roc_auc_score(y_test, test_pre)
    print("{}_auc_train:{:.4f}".format(clf_name, auc_train))
    print("{}_auc_test:{:.4f}".format(clf_name, auc_test))

在主函数中测试:

if __name__ == "__main__":
    X_train, X_test, y_train, y_test = load_data()
    # 将需要测试的算法和其调用方法放入一个数组中
    clf_dict = {"bayes":naive_bayes.GaussianNB(),
                "logistic":linear_model.LogisticRegression(solver="liblinear"),
                "decision_tree":DecisionTreeClassifier(criterion="entropy", max_depth=5),
                "random_forest":RandomForestClassifier(n_estimators=100, max_depth=None, min_samples_split=2, random_state=0),
                "adaboost":AdaBoostClassifier(n_estimators=100)
                }
    # 循环数组将不同算法放入封装的测试方法中
    for clf_name, clf in clf_dict.items():
        clf_test(clf_name, clf, X_train, X_test, y_train, y_test)
        print("-"*10)

4.完整代码展示

import numpy as np
import pandas as pd

from sklearn import datasets
from sklearn import naive_bayes
from sklearn import linear_model
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score;

# 导入招商银行数据集
def load_data():
    # 导入数据集
    data = pd.read_csv("train_agg.csv", sep="\t")
    label = pd.read_csv("train_label.csv",sep="\t")
    data_label = data.merge(label, how="left", on="USRID")

    # 得到训练集和测试集数据
    data_label.drop(['USRID'],axis = 1, inplace = True)
    columns = data_label.columns.tolist()
    feature_columns = [i for i in columns if i != "FLAG"]
    data_array = data_label[feature_columns].values
    label_array = data_label['FLAG'].values
    # print(data_array)
    # print(label_array)
    return train_test_split(data_array, label_array, test_size=0.25, random_state=10,stratify=label_array)

# 封装重复部分
def clf_test(clf_name, clf, *data):
    # 导入X、Y的训练集和测试集数据
    X_train, X_test, y_train, y_test = data
    # fit方法拟合数据
    clf.fit(X_train, y_train)
    # predict_proba方法进行预测
    train_pre = clf.predict_proba(X_train)[:,1]
    test_pre = clf.predict_proba(X_test)[:,1]
    # roc_auc_score方法计算预测后的auc评价指标
    auc_train = roc_auc_score(y_train, train_pre)
    auc_test = roc_auc_score(y_test, test_pre)
    print("{}_auc_train:{:.4f}".format(clf_name, auc_train))
    print("{}_auc_test:{:.4f}".format(clf_name, auc_test))
    
if __name__ == "__main__":
    # 导入数据集
    X_train, X_test, y_train, y_test = load_data()
    # 将需要测试的算法和其调用方法放入一个数组中
    clf_dict = {"bayes":naive_bayes.GaussianNB(),
                "logistic":linear_model.LogisticRegression(solver="liblinear"),
                "decision_tree":DecisionTreeClassifier(criterion="entropy", max_depth=5),
                "random_forest":RandomForestClassifier(n_estimators=100, max_depth=None, min_samples_split=2, random_state=0),
                "adaboost":AdaBoostClassifier(n_estimators=100)
                }
    # 循环数组将不同算法放入封装的测试方法中
    for clf_name, clf in clf_dict.items():
        clf_test(clf_name, clf, X_train, X_test, y_train, y_test)
        print("-"*10)

5.结果展示

在这里插入图片描述

6.参考链接

1.read_csv方法及其参数详解:https://blog.csdn.net/u010801439/article/details/80033341

2.drop方法运用及其参数详解:https://blog.csdn.net/qq_42665335/article/details/81178418

https://blog.csdn.net/nuaadot/article/details/78304642

3.train_test_split的运用及详解:https://blog.csdn.net/jiaxinhong/article/details/81775503

4.LogisticRegression方法及其参数详解:https://blog.csdn.net/kingzone_2008/article/details/81067036

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值