一、选题的背景
假设一家金融公司需要对用户的信用进行快速的评分,并对其信用等级进行分类,如果使用人工进行分类无疑是需要耗费大量的人力和时间。该公司收集了用户的银行详细信息,希望通过这些信息构建一个对信用评分进行分类的机器学习模型,给定一个人的信用相关信息后,可以快速的对其信用评分进行分类。
二、机器学习案例设计方案
1.数据集来源
该数据集来自Kaggle,总共包含28个字段,10万条数据。
2.机器学习框架描述
决策树:
决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
决策树的生成主要分以下两步,这两步通常通过学习已经知道分类结果的样本来实现。
(1)节点的分裂:一般当一个节点所代表的属性无法给出判断时,则选择将这一节点分成2个子节点(如不是二叉树的情况会分成n个子节点)
(2)阈值的确定:选择适当的阈值使得分类错误率最小 (Training Error)。
比较常用的决策树有ID3,C4.5和CART(Classification And Regression Tree),CART的分类效果一般优于其他决策树。
ID3: 由增熵(Entropy)原理来决定那个做父节点,那个节点需要分裂。对于一组数据,熵越小说明分类结果越好。
C4.5:通过对ID3的学习,可以知道ID3存在一个问题,那就是越细小的分割分类错误率越小,所以ID3会越分越细,所以为了避免分割太细,c4.5对ID3进行了改进,C4.5中,优化项要除以分割太细的代价,这个比值叫做信息增益率,显然分割太细分母增加,信息增益率会降低。除此之外,其他的原理和ID3相同。
CART是一个二叉树,也是回归树,同时也是分类树,CART的构成简单明了。CART只能将一个父节点分为2个子节点。CART用GINI指数来决定如何分裂:GINI指数:总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)。
CART还是一个回归树,回归解析用来决定分布是否终止。理想地说每一个叶节点里都只有一个类别时分类应该停止,但是很多数据并不容易完全划分,或者完全划分需要很多次分裂,必然造成很长的运行时间,所以CART可以对每个叶节点里的数据分析其均值方差,当方差小于一定值可以终止分裂,以换取计算成本的降低。
CART和ID3一样,存在偏向细小分割,即过度学习(过度拟合的问题),为了解决这一问题,对特别长的树进行剪枝处理,直接剪掉。
逻辑回归:
Logistic 回归的本质是:假设数据服从这个分布,然后使用极大似然估计做参数的估计。Logistic 分布是由其位置和尺度参数定义的连续分布。Logistic 分布的形状与正态分布的形状相似,但是 Logistic 分布的尾部更长,所以我们可以使用 Logistic 分布来建模比正态分布具有更长尾部和更高波峰的数据分布。
KNN:
KNN通过测量不同特征值之间的距离来进行分类。对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。
KNN的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签。
一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的类别,作为新数据的分类。
随机森林:
随机森林就是通过集成学习的Bagging思想将多棵树集成的一种算法:它的基本单元就是决策树。将一个输入样本进行分类,就需要将它输入到每棵树中进行分类。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想。
每棵树的按照如下规则生成:
(1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(就是bootstrap sample方法, 拔靴法采样)作为该树的训练集;从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本。
(2)如果存在M个特征,则在每个节点分裂的时候,从M中随机选择m个特征维度(m << M),使用这些m个特征维度中最佳特征(最大化信息增益)来分割节点。在森林生长期间,m的值保持不变。
3.技术难点与解决思路
该数据集的异常数据比较多,处理数据的时候需要考虑每一个数据的实际情况。在最开始的时候没有对异常值进行处理,导致预测出来的结果很差。经过绘制箱线图对每一个数据进行分析,然后消除其异常值。
三、机器学习的实现步骤
为了对数据进行分析,首先需要查看数据,明确每个字段的含义。具体含义如下:
ID:表示条目的唯一标识<br>
Customer_ID:表示人员的唯一标识<br>
Month:表示一年中的月份<br>
Name:表示人员的姓名<br>
Age:表示人的年龄<br>
SSN:表示个人的社会安全号码<br>
Age:表示人员的职业<br>
Annual_Income:表示个人的年收入<br>
Monthly_Inhand_Salary:表示一个人的月基本工资<br>
Num_Bank_Accounts:表示一个人持有的银行帐户数<br>
Num_Credit_Card:表示一个人持有的其他信用卡的数量<br>
Interest_Rate:表示信用卡的利率<br>
Num_of_Load:表示从银行获得的贷款数量<br>
Type_of_Load:表示一个人贷款的类型<br>
Delay_from_due_date:表示从付款日期延迟的平均天数<br>
Num_of_Delayed_Payment:表示一个人延迟的平均付款次数<br>
Changed_Credit_Limit:表示信用卡限额的百分比变化<br>
Num_Credit_Iquiries:表示信用卡查询的数量<br>
Credit_Mix:表示信贷组合的分类<br>
Outstanding_Debt:表示待偿还的剩余债务(美元)<br>
Credit_Uutilization_Ratio:表示信用卡的使用率<br>
Credit_History_Age:表示人员的信用历史记录的年龄<br>
Payment_of_Min_Amount:表示人员是否只支付了最低金额<br>
Total_EMI_per_month:表示每月EMI付款(美元)<br>
Amount_invested_monthly:表示客户每月投资的金额(美元)<br>
Payment_Behaviour:表示客户的付款行为(美元)<br>
Monthly_Balance:表示客户的月余额(美元)<br>
Credit_Score:表示信用评分的等级(差、标准、好)<br>
明确数据含义后,导入数据处理相关的库和机器学习库。然后使用pandas库中的read_csv方法读取csv数据,并使用head方法查看前5行数据,结果如图1所示。
图1 前五行数据
使用info方法和describe方法对数据进行简单的探索,接下来对数据进行分析。首先查看'Monthly_Inhand_Salary', 'Delay_from_due_date', 'Credit_Utilization_Ratio'这三个变量和信用分数的关系,结果如图2所示。
|
|
|
图2 信用分数关系图 |
然后查看object类型变量和信用分数的关系,结果如图3所示(仅展示部分结果)。
图3 object类型变量与信用分数关系图
接下来查看是否有缺失数据,结果如图4所示。
图4 缺失数据
接下来处理缺失数据,首先对少量数据进行删除。然后分别对每一个缺失值进行填充处理,并查看其数据分布。所有数据处理完毕后,再次查看是否有缺失值,发现已经没有缺失值。
处理完缺失值后,对异常值进行处理,首先绘制图像,查看是否有异常值,如图5所示(仅展示部分图片)。发现有一些异常值,如年龄不在0到100之间等,分别对其进行处理。
图5 年龄箱线图
处理完异常值后进行特征工程处理,首先编码种类特征值,然后查看每个特征的相关性,绘制特征相关系数图,如图6所示,选择相关性较高的15个特征。
图6 相关特征图
利用选出来的特征构建训练集和测试集,然后以训练集:测试集=0.75:0.25的比例进行划分。划分完毕后对数据进行缩放。
然后建立决策树模型,并进行训练。然后使用gridsearch方法对决策树模型的参数进行调优,得到最优的结果。使用调优后的决策树模型进行测试,计算accuracy、precision、recall、f1-score,结果如图7所示。
图7 决策树模型结果
最后,与逻辑回归,KNN,随机森林三种方法进行了对比。结果如图8,图9,图10所示。
图8 逻辑回归模型结果
图9 KNN模型结果
图10 随机森林模型结果
四、总结
在本次课程设计中,学习了如何系统规范的进行数据分析,并对以下几种机器学习模型进行了学习。
首先是Logistic回归其实是基于一种曲线的,“线”这种连续的表示方法有一个很大的问题,就是在表示跳变数据时会产生“阶跃”的现象,说白了就是很难表示数据的突然转折。所以用Logistic回归必须使用一个称为“海维塞德阶跃函数”的Sigmoid函数来表示跳变。通过Sigmoid就可以得到分类的结果。
第二个是KNN。KNN将测试集的数据特征与训练集的数据进行特征比较,然后算法提取样本集中特征最近邻数据的分类标签,即KNN算法采用测量不同特征值之间的距离的方法进行分类。KNN的思路很简单,就是计算测试数据与类别中心的距离。KNN具有精度高、对异常值不敏感、无数据输入假定、简单有效的特点,但其缺点也很明显,计算复杂度太高。要分类一个数据,却要计算所有数据,这在大数据的环境下是很可怕的事情。而且,当类别存在范围重叠时,KNN分类的精度也不太高。所以,KNN比较适合小量数据且精度要求不高的数据。KNN有两个影响分类结果较大的函数,一个是数据归一化,一个是距离计算。如果数据不进行归一化,当多个特征的值域差别很大的时候,最终结果就会受到较大影响;第二个是距离计算。这应该算是KNN的核心了。目前用的最多的距离计算公式是欧几里得距离,也就是我们常用的向量距离计算方法。
个人感觉,KNN最大的作用是可以随时间序列计算,即样本不能一次性获取只能随着时间一个一个得到的时候,KNN能发挥它的价值。至于其他的特点,它能做的,很多方法都能做;其他能做的它却做不了。
第三个是决策树。据我了解,决策树是最简单,也是曾经最常用的分类方法了。决策树基于树理论实现数据分类,个人感觉就是数据结构中的B+树。决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。决策树计算复杂度不高、输出结果易于理解、对中间值缺失不敏感、可以处理不相关特征数据。其比KNN好的是可以了解数据的内在含义。但其缺点是容易产生过度匹配的问题,且构建很耗时。决策树还有一个问题就是,如果不绘制树结构,分类细节很难明白。所以,生成决策树,然后再绘制决策树,最后再分类,才能更好的了解数据的分类过程。
决策树的核心树的分裂。到底该选择什么来决定树的分叉是决策树构建的基础。最好的方法是利用信息熵实现。熵这个概念很头疼,很容易让人迷糊,简单来说就是信息的复杂程度。信息越多,熵越高。所以决策树的核心是通过计算信息熵划分数据集。
最后是随机森林。随机森林就是通过集成学习的Bagging思想将多棵树集成的一种算法:它的基本单元就是决策树。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,其实这也是随机森林的主要思想--集成思想的体现。
1 # 基础数据处理和可视化库 2 import numpy as np 3 import pandas as pd 4 import seaborn as sns 5 import matplotlib.pyplot as plt 6 7 # sklearn 8 from sklearn import tree 9 from sklearn.preprocessing import LabelEncoder as le # label encoder 10 from sklearn.model_selection import train_test_split # train & test split 11 from sklearn.preprocessing import RobustScaler as rbScaler # robust scaler 12 from sklearn.ensemble import VotingClassifier as voClassifier # voting 13 from sklearn.tree import DecisionTreeClassifier as dtClassifier # decision tree 14 from sklearn.ensemble import AdaBoostClassifier as adabClassifier # adaboosting 15 from sklearn.neighbors import KNeighborsClassifier as knnClassifier # knn 16 from sklearn.ensemble import RandomForestClassifier as rfClassifier # random forest 17 from sklearn.linear_model import LogisticRegression as lgrClassifier # logistic regression 18 from sklearn.ensemble import GradientBoostingClassifier as gbClassifier # gbm 19 from sklearn.model_selection import GridSearchCV # grid search 20 # 其他分类算法库 21 from lightgbm import LGBMClassifier as lgbClassifier # light gbm 22 from xgboost import XGBClassifier # xgboosting # catboosting 23 24 # 数据导入 25 # 读取数据 26 data = pd.read_csv("../train.csv", encoding = "utf-8" , sep = ",", low_memory=False) 27 data.head() 28 29 data.info() # 查看数据信息 30 31 data.describe() # 查看数据描述性统计 32 33 data.describe(include="object") # 查看数据描述性统计 34 35 data.isnull().sum() # 查看缺失值 36 37 # 查看以下三类变量和信用分数的关系 38 numCols = ['Monthly_Inhand_Salary', 'Delay_from_due_date', 'Credit_Utilization_Ratio'] 39 for col in numCols: 40 plt.figure(figsize=(18,6)) 41 sns.displot(x=col,data=data, hue='Credit_Score', palette=["#ff006e", "#83c5be", "#3a0ca3"]) 42 plt.show() 43 44 # 查看object类型变量和信用分数的关系 45 objCols = ['Month', 'Occupation', 'Credit_Mix', 'Payment_of_Min_Amount', 'Payment_Behaviour'] 46 for col in objCols: 47 plt.figure(figsize=(18,6)) 48 sns.countplot(x=col,data=data, palette="mako", hue="Credit_Score") 49 plt.show() 50 51 rows = ['Age', 'Annual_Income', 'Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit', 'Outstanding_Debt', 'Amount_invested_monthly', 'Monthly_Balance'] 52 pd.set_option('mode.chained_assignment',None) 53 54 for row in rows: 55 data[row] = data[row].str.replace(r'_+', '') 56 57 for row in rows: 58 data[row] = pd.to_numeric(data[row], errors='coerce') 59 60 data.info() 61 62 # 处理缺失数据 63 data.dropna(thresh=26, inplace=True) 64 65 data.isnull().sum() 66 67 data = data[['Month', 'Age', 'Occupation','Annual_Income', 'Monthly_Inhand_Salary', 'Num_Bank_Accounts', 68 'Num_Credit_Card', 'Interest_Rate', 'Num_of_Loan', 'Type_of_Loan', 69 'Delay_from_due_date', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit', 70 'Num_Credit_Inquiries', 'Credit_Mix', 'Outstanding_Debt', 71 'Credit_Utilization_Ratio', 'Credit_History_Age', 72 'Payment_of_Min_Amount', 'Total_EMI_per_month', 73 'Amount_invested_monthly', 'Payment_Behaviour', 'Monthly_Balance', 74 'Credit_Score']] 75 76 # 处理 Monthly_Inhand_Salary缺失值 77 fill_list = data['Monthly_Inhand_Salary'].dropna().tolist() 78 data['Monthly_Inhand_Salary'] = data['Monthly_Inhand_Salary'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 79 80 plt.figure(figsize=(12,8)) 81 sns.displot(data=data, x="Monthly_Inhand_Salary", kde=True, color="#1a659e") 82 83 # 处理Type_of_Loan缺失值 84 fill_list = data['Type_of_Loan'].dropna().tolist() 85 data['Type_of_Loan'] = data['Type_of_Loan'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 86 87 # 处理Num_of_Delayed_Paymen缺失值 88 fill_list = data['Num_of_Delayed_Payment'].dropna().tolist() 89 data['Num_of_Delayed_Payment'] = data['Num_of_Delayed_Payment'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 90 91 # 处理Changed_Credit_Limit缺失值 92 fill_list = data['Changed_Credit_Limit'].dropna().tolist() 93 data['Changed_Credit_Limit'] = data['Changed_Credit_Limit'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 94 95 # 处理Num_Credit_Inquiries缺失值 96 fill_list = data['Num_Credit_Inquiries'].dropna().tolist() 97 data['Num_Credit_Inquiries'] = data['Num_Credit_Inquiries'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 98 99 # 处理 Credit_History_Age缺失值 100 fill_list = data['Credit_History_Age'].dropna().tolist() 101 data['Credit_History_Age'] = data['Credit_History_Age'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 102 103 # 处理Amount_invested_monthly缺失值 104 fill_list = data['Amount_invested_monthly'].dropna().tolist() 105 data['Amount_invested_monthly'] = data['Amount_invested_monthly'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 106 107 # 处理 Monthly_Balance缺失值 108 fill_list = data['Monthly_Balance'].dropna().tolist() 109 data['Monthly_Balance'] = data['Monthly_Balance'].fillna(pd.Series(np.random.choice(fill_list , size = len(data.index)))) 110 111 data.dropna(thresh=24, inplace=True) 112 data.isnull().sum() 113 114 # 处理异常值 115 numCols = data.select_dtypes([np.number]).columns 116 for col in numCols: 117 fig, ax =plt.subplots(1,2, figsize=(12,8)) 118 sns.boxplot(data=data, y=col, ax=ax[0], color='#7209b7') 119 sns.scatterplot(data=data,x = 'Credit_Score', s = 100, y=col, ax=ax[1], color ='#ee1199') 120 plt.show() 121 122 # 处理Age异常值 123 ((data['Age'] <= 100) & (data['Age'] >= 0)).value_counts() 124 data = data[(data['Age'] <= 100) & (data['Age'] >= 0)] 125 126 # 处理Annual_Income异常值 127 (data['Annual_Income'] <= 300000).value_counts() 128 data = data[(data['Annual_Income'] <= 300000)] 129 130 # 处理Monthly_Inhand_Salary异常值 131 (data['Monthly_Inhand_Salary'] <= 15000).value_counts() 132 data = data[(data['Monthly_Inhand_Salary'] <= 15000)] 133 134 # 处理Num_Bank_Accounts异常值 135 (data['Num_Bank_Accounts'] <= 750).value_counts() 136 data = data[(data['Num_Bank_Accounts'] <= 750)] 137 138 # 处理Num_Credit_Card异常值 139 (data['Num_Credit_Card'] <= 1000).value_counts() 140 data = data[(data['Num_Credit_Card'] <= 1000)] 141 142 # 处理Interest_Rate异常值 143 (data['Interest_Rate'] <= 5000).value_counts() 144 data = data[(data['Interest_Rate'] <= 5000)] 145 146 # 处理Num_of_Loan异常值 147 (data['Num_of_Loan'] <= 1100).value_counts() 148 data = data[(data['Num_of_Loan'] <= 1100)] 149 150 # 处理Delay_from_due_date异常值 151 (data['Delay_from_due_date'] <= 65).value_counts() 152 data = data[(data['Delay_from_due_date'] <= 65)] 153 154 # 处理Num_of_Delayed_Payment异常值 155 (data['Num_of_Delayed_Payment'] <= 1000).value_counts() 156 data = data[(data['Num_of_Delayed_Payment'] <= 1000)] 157 158 # 处理Changed_Credit_Limit异常值 159 (data['Changed_Credit_Limit'] <= 30).value_counts() 160 data = data[(data['Changed_Credit_Limit'] <= 30)] 161 162 # 处理Num_Credit_Inquiries异常值 163 (data['Num_Credit_Inquiries'] <= 2400).value_counts() 164 data = data[(data['Num_Credit_Inquiries'] <= 2400)] 165 166 # 处理Outstanding_Debt异常值 167 (data['Outstanding_Debt'] <= 4950).value_counts() 168 data = data[(data['Outstanding_Debt'] <= 4950)] 169 170 # 处理 Credit_Utilization_Ratio异常值 171 (data['Credit_Utilization_Ratio'] <= 45).value_counts() 172 data = data[(data['Credit_Utilization_Ratio'] <= 45)] 173 174 # 处理Total_EMI_per_month异常值 175 (data['Total_EMI_per_month'] <= 75000).value_counts() 176 data = data[(data['Total_EMI_per_month'] <= 75000)] 177 178 # 处理Amount_invested_monthly异常值 179 (data['Amount_invested_monthly'] <= 9000).value_counts() 180 181 # 处理Monthly_Balance异常值 182 (data['Monthly_Balance'] > -1).value_counts() 183 data = data[(data['Monthly_Balance'] > -1)] 184 185 # 特征工程 186 ### 编码种类特征值 187 data.select_dtypes(['object']).columns 188 Month_le = le() 189 Occupation_le = le() 190 Type_of_Loan_le = le() 191 Credit_Mix_le = le() 192 Credit_History_Age_le = le() 193 Payment_of_Min_Amount_le = le() 194 Payment_Behaviour_le = le() 195 Credit_Score_le = le() 196 data['Month'] = Month_le.fit_transform(data['Month']) 197 data['Occupation'] = Occupation_le.fit_transform(data['Occupation']) 198 data['Type_of_Loan'] = Type_of_Loan_le.fit_transform(data['Type_of_Loan']) 199 data['Credit_Mix'] = Credit_Mix_le.fit_transform(data['Credit_Mix']) 200 data['Credit_History_Age'] = Credit_History_Age_le.fit_transform(data['Credit_History_Age']) 201 data['Payment_of_Min_Amount'] = Payment_of_Min_Amount_le.fit_transform(data['Payment_of_Min_Amount']) 202 data['Payment_Behaviour'] = Payment_Behaviour_le.fit_transform(data['Payment_Behaviour']) 203 data['Credit_Score'] = Credit_Score_le.fit_transform(data['Credit_Score']) 204 205 # 查看特征相关性 206 plt.figure(figsize = (14,10)) 207 sns.heatmap(data.corr() , annot = True , cmap = "YlGnBu") 208 209 ### 特征选择 210 round(abs(data.corr()['Credit_Score']*100).sort_values(ascending=False), 2) 211 pd.DataFrame(abs(data.corr()['Credit_Score'].drop('Credit_Score')*100).sort_values(ascending=False)).plot.bar(figsize = (10,8)) 212 mdf = data[['Credit_Score','Changed_Credit_Limit', 'Payment_of_Min_Amount', 'Credit_Mix', 'Delay_from_due_date', 'Annual_Income', 'Monthly_Inhand_Salary', 'Age', 'Monthly_Balance', 'Num_of_Delayed_Payment', 'Outstanding_Debt', 'Payment_Behaviour', 'Credit_History_Age', 'Num_Bank_Accounts', 'Credit_Utilization_Ratio']] 213 214 # 构建训练集和测试集 215 x = mdf.drop(['Credit_Score'] , axis = 1).values 216 y = mdf['Credit_Score' ].values 217 218 # 分割数据集 219 x_train , x_test , y_train , y_test = train_test_split(x,y , test_size= 0.25 , random_state=42) 220 [x_train.shape, y_train.shape] 221 222 ### 数据缩放 223 ro_scaler = rbScaler() 224 x_train = ro_scaler.fit_transform(x_train) 225 x_test = ro_scaler.fit_transform(x_test) 226 [x_train.shape, x_test.shape] 227 228 # 建立模型 229 # 决策树 230 dt = dtClassifier(max_features=14, max_depth=8) 231 dt.fit(x_train , y_train) 232 dt_score = dt.score(x_train , y_train) 233 dt_score_t = dt.score(x_test , y_test) 234 y_pred3 = dt.predict(x_test) 235 dd = pd.DataFrame({"Y_test" : y_test , "y_pred3": y_pred3}) 236 plt.figure(figsize=(10,8)) 237 plt.plot(dd[:100]) 238 plt.legend(["Actual" , "Predicted"]) 239 240 # 模型参数调优 241 # 使用gridsearchCV进行超参数调优 242 param_grid = {'max_depth': np.arange(1, 10), 243 'max_features': np.arange(1, 15)} 244 dt = dtClassifier() 245 dt_cv = GridSearchCV(dt, param_grid, cv=5) 246 dt_cv.fit(x_train, y_train) 247 print("Tuned Decision Tree Parameters: {}".format(dt_cv.best_params_)) 248 print("Best score is {}".format(dt_cv.best_score_)) 249 250 # 决策树 251 max_depth = dt_cv.best_params_['max_depth'] 252 max_features = dt_cv.best_params_['max_features'] 253 dt = dtClassifier(max_features=max_features, max_depth=max_depth) 254 dt.fit(x_train , y_train) 255 dt_score = dt.score(x_train , y_train) 256 dt_score_t = dt.score(x_test , y_test) 257 y_pred3 = dt.predict(x_test) 258 dd = pd.DataFrame({"Y_test" : y_test , "y_pred3": y_pred3}) 259 plt.figure(figsize=(10,8)) 260 plt.plot(dd[:100]) 261 plt.legend(["Actual" , "Predicted"]) 262 263 # 模型使用及评估 264 # 计算accuracy 265 import sklearn.metrics as metrics 266 print("Accuracy:",metrics.accuracy_score(y_test, y_pred3)) 267 268 # 计算precision 269 print("Precision:",metrics.precision_score(y_test, y_pred3, average='macro')) 270 271 # 计算recall 272 print("Recall:",metrics.recall_score(y_test, y_pred3, average='macro')) 273 274 # 计算f1-score 275 print("F1-score:",metrics.f1_score(y_test, y_pred3, average='macro')) 276 277 # 模型对比 278 # 逻辑回归 279 lgr = lgrClassifier(C = 100) 280 lgr.fit(x_train , y_train) 281 lgr_score = lgr.score(x_train , y_train) 282 lgr_score_t = lgr.score(x_test , y_test) 283 y_pred1 = lgr.predict(x_test) 284 dd = pd.DataFrame({"Y_test" : y_test , "y_pred1": y_pred1}) 285 plt.figure(figsize=(10,8)) 286 plt.plot(dd[:100]) 287 plt.legend(["Actual" , "Predicted"]) 288 289 # 计算accuracy 290 import sklearn.metrics as metrics 291 print("Accuracy:",metrics.accuracy_score(y_test, y_pred1)) 292 293 # 计算precision 294 print("Precision:",metrics.precision_score(y_test, y_pred1, average='macro')) 295 296 # 计算recall 297 print("Recall:",metrics.recall_score(y_test, y_pred1, average='macro')) 298 299 # 计算f1-score 300 print("F1-score:",metrics.f1_score(y_test, y_pred1, average='macro')) 301 302 # KNN 303 knn = knnClassifier(n_neighbors=5) 304 knn.fit(x_train , y_train) 305 knn_score = knn.score(x_train , y_train) 306 knn_score_t = knn.score(x_test , y_test) 307 y_pred2 = knn.predict(x_test) 308 dd = pd.DataFrame({"Y_test" : y_test , "y_pred2": y_pred2}) 309 plt.figure(figsize=(10,8)) 310 plt.plot(dd[:100]) 311 plt.legend(["Actual" , "Predicted"]) 312 313 # 计算accuracy 314 import sklearn.metrics as metrics 315 print("Accuracy:",metrics.accuracy_score(y_test, y_pred2)) 316 317 # 计算precision 318 print("Precision:",metrics.precision_score(y_test, y_pred2, average='macro')) 319 320 # 计算recall 321 print("Recall:",metrics.recall_score(y_test, y_pred2, average='macro')) 322 323 # 计算f1-score 324 print("F1-score:",metrics.f1_score(y_test, y_pred2, average='macro')) 325 326 # 随机森林 327 rf = rfClassifier(max_features= 14, max_depth= 8) 328 rf.fit(x_train , y_train) 329 rf_score = rf.score(x_train , y_train) 330 rf_score_t = rf.score(x_test , y_test) 331 y_pred4 = rf.predict(x_test) 332 dd = pd.DataFrame({"Y_test" : y_test , "y_pred4": y_pred4}) 333 plt.figure(figsize=(10,8)) 334 plt.plot(dd[:100]) 335 plt.legend(["Actual" , "Predicted"]) 336 337 # 计算accuracy 338 import sklearn.metrics as metrics 339 print("Accuracy:",metrics.accuracy_score(y_test, y_pred4)) 340 341 # 计算precision 342 print("Precision:",metrics.precision_score(y_test, y_pred4, average='macro')) 343 344 # 计算recall 345 print("Recall:",metrics.recall_score(y_test, y_pred4, average='macro')) 346 347 # 计算f1-score 348 print("F1-score:",metrics.f1_score(y_test, y_pred4, average='macro'))
标签:分数,le,机器,信用,train,Credit,score,test,data From: https://www.cnblogs.com/lin-kailun/p/16997319.html