本文为个人学习笔记,仅供学习参考,欢迎讨论,要是有哪里写的不对或有疑问的欢迎讨论。
题目:运用已给数据集进行模型训练,使用逻辑回归、决策树、随机森林和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