机器学习—贷款能力的评估

  一、选题背景

      在社会经济的不断发展的催化下,“贷款”应由诞生。贷款解决了许多人暂时性的资金不足的问题,但同时也产生了许多无力偿还,造成违约的的案列 。本人对于验证人的偿还能力比较感兴趣所以选择了改课题研究方向。数据来源于UCI机器学习数据中的台湾违约案列,针对贷款能力的评估。

附上数据来源链接:UCI Machine Learning Repository

 

二、机器学习案列和设计方案

1.机器学习案列来源:UCI机器学习数据集,整体数据集分为训练与测试集。
2.框架描述:①读取数据并处理
                     ②数据预处理(pca,标准化)
                     ③svm,logtistic,随机森林,Kmeans四种模型训练
                     ④模型评估
                     
3.技术难点与解决思路:数据集比较难,特征多,不易得到好结果。
                                       采用PCA降维处理,数据标准化。

模型简单描述:

 PCA(Principal Component Analysis)

       即主成分分析方法,是一种使用最广泛的数据降维算法(非监督的机器学习方法)。其最主要的用途在于“降维”,通过析取主成分显出的最大的个别差异,发现更便于人类理解的特征。也可以用来削减回归分析和聚类分析中变量的数目。

 SVM(support vector machines)

        支持向量机(support vector machines,SVM)是一种二分类模型,它将实例的特征向量映射为空间中的一些点,SVM 的目的就是想要画出一条线,以 “最好地” 区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。SVM 适合中小型数据样本、非线性、高维的分类问题。

 逻辑回归(Logistic Regression)

        Logistic Regression算法是一个分类算法,分类算法是一种监督学习算法,它是指根据样本的特征,将样本划分到指定的类别中。Logistic Regression是一个二分类的线性分类算法,说到线性分类算法就不得不说一下线性可分与线性不可分的概念了,如果一个分类问题可以使用线性判别函数正确分类,则称该问题为线性可分,否则称为线性不可分问题。

 

 随机森林(RandomForest)

       随机森林是一个元估计器,它适合数据集的各个子样本上的多个决策树分类器,并使用平均值来提高预测精度和控制过度拟合。 子样本大小始终与原始输入样本大小相同,但如果bootstrap = True(默认值),则会使用替换来绘制样本。

 K-means聚类算法

    kmeans算法又名k均值算法。其算法思想大致为:先从样本集中随机选取 kk 个样本作为簇中心,并计算所有样本与这 kk 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。实现kmeans算法的主要三点:(1)簇个数 kk 的选择(2)各个样本点到“簇中心”的距离(3)根据新划分的簇,更新“簇中心”。

附上学习转载链接:机器学习算法(一)SVM_yaoyz105-CSDN博客_svm

                                Python实现Logistic Regression(逻辑回归模型)算法_象在舞的技术专栏-CSDN博客_python实现逻辑回归模型

                                机器学习分类算法(六)-随机森林算法_猫敷雪-CSDN博客_机器学习 随机森林

                               K-means聚类算法原理及python实现_Flaneur-yz的博客-CSDN博客_k-means聚类算法python实现

                               kmeans算法理解及代码实现 - LLLiuye - 博客园 (cnblogs.com) 

 

 

附上数据集小部分截图及其变量解释:

 

 

X1:给定信贷的金额(新台币):它包括个人消费者信贷和他/她的家庭(补充)信贷。

X2:性别(1 = 男性;2 = 女性)。

X3:教育(1 =研究生院;2=大学;3=高中;4=其他)。

X4:婚姻状况(1 =已婚;2=单身;3=其他人)。

X5:年龄(年)。

X6 - X11:过去付款的历史记录。我们跟踪了过去的每月付款记录(2005年4月到9月)

X12-X17:账单金额(新台币)。

X18-X23:之前付款金额(新台币)。

三、机器学习的实现步骤

导入相关的库

 1 #导入相关的库
 2 import numpy as np
 3 import pandas as pd
 4 import matplotlib.pyplot as plt
 5 from sklearn.linear_model import LogisticRegression
 6 from sklearn.model_selection import GridSearchCV
 7 from sklearn.model_selection import train_test_split
 8 from sklearn.metrics import f1_score, auc, roc_curve
 9 from sklearn.svm import LinearSVC
10 from sklearn.ensemble import RandomForestClassifier
11 from sklearn.cluster import KMeans
12 from sklearn.preprocessing import StandardScaler
13 from sklearn.metrics import mean_absolute_error
14 from sklearn.metrics import mean_squared_error
15 from sklearn.ensemble import RandomForestRegressor 
16 import joblib 
17 from tqdm import tqdm 

 读取文件以及数据分析

1 #读取文件以及数据分析
2 head = 1
3 index = "ID"
4 data = pd.read_excel("D:/default of credit card clients.xls", header=head, index_col=index)
5 #查看前五行数据
6 data.head(5)

结果截图:

 

  (可以看出数据特征较多,如果直接训练结果不会很好!)

1 #可见数据有20多个特征,特征值分为0,1
2 print(data.shape)
3 data = data.dropna()
4 print(data.shape)
5 data.describe()

结果截图:

 

 (可见没有缺失值)

  数据预处理  

 1 #上面测试过,并未有缺失值,所有不做处理
 2 #设置两个列表用于最终结果绘图
 3 acc_all = []
 4 mse_all = []
 5 #标签值与特征分开
 6 X = data.iloc[:, 0:23]
 7 Y = data.iloc[:, 23]
 8 #数据特征较多,所有进行降维处理,并且不断调参以后发现10会得到较好结果
 9 #pca降维
10 from sklearn.decomposition import PCA
11 pca = PCA(n_components=10)
12 X0 = pca.fit_transform(X)
13 
14 #数据标准化
15 S = StandardScaler()
16 S.fit(X0)
17 X = S.transform(X0)

     因为数据特征多,所以使用pca降维算法,还用了数据标准化,因为数据比较分散。

PS:Pca降维能使得所有模型准确率提高5%左右,标准化能使得svm和逻辑回归模型准确率提高20%左右,但对于随机森林没有任何影响(因为随机森林对于数据零散没有影响),反而使得kmean准确率降低15%左右(因为kmeans自然是数据越分散越好)。

 

  数据集分割

1 x_train, x_test, y_train, y_test = train_test_split(X, Y,
2                                                     train_size=0.8, random_state=999)
3 print(x_train.shape, y_train.shape)
4 #对于kmeans不需要标准化的效果更好所所以给出一份数据用于kmeans
5 x_train0, x_test0, y_train0, y_test0 = train_test_split(X0, Y,
6                                                     train_size=0.8, random_state=999)

结果截图:

 (82分割,设置好随机种子,便于分析结果)

 

接下来进入模型训练环节

   SVM模型测试以及评估

1 #训练未标准化的数据
2 svm = LinearSVC()
3 svm.fit(x_train, y_train)
4 #训练未标准化数据
5 svm0 = LinearSVC()
6 svm0.fit(x_train0, y_train0)

 

 1 #测试集预测准确率
 2 print("标准化svm的准确率", svm.score(x_test, y_test))
 3 y_pred = svm.predict(x_test)
 4 
 5 print("未标准化svm的准确率", svm0.score(x_test0, y_test0))
 6 y_pred0 = svm0.predict(x_test0)
 7 
 8 acc_all.append(svm.score(x_test, y_test))
 9 acc_all.append(svm0.score(x_test0, y_test0))
10 #误差分析
11 print(mean_squared_error(y_test, y_pred))
12 mse_all.append(mean_squared_error(y_test, y_pred))
13 print(mean_squared_error(y_test, y_pred0))
14 mse_all.append(mean_squared_error(y_test, y_pred0))
15 #绘制ROC曲线
16 y_score = svm.fit(x_train, y_train).decision_function(x_test)
17 fp, tp, threshold = roc_curve(y_test, y_score) 
18 roc_auc = auc(fp, tp) 
19 
20 plt.figure(figsize=(10,4))
21 plt.plot(fp, tp, color='darkorange',
22          lw=2, label='ROC curve (area = %0.2f)' % roc_auc) 
23 plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
24 plt.xlim([0.0, 1.0])
25 plt.ylim([0.0, 1.05])
26 plt.xlabel('FP')
27 plt.ylabel('TP')
28 plt.title('ROC曲线')
29 plt.legend(loc="best")
30 plt.show()

结果截图:

 

标准化SVM的准确率能达到0.773

未标准化SVM的准确率能达到0.5705

小总结:明显标准化对于svm的分类是正向作用,所有以后采用svm分类时尽量进行数据标准化,Svm参数可以调节的主要是核函数,但rbf运行会很慢所有不做展示。

 

  逻辑回归训练以及ROC曲线绘制

1 clf = LogisticRegression(C=0.01)
2 g = GridSearchCV(clf, param_grid=[{'C':[0.01, 0.1, 1, 10]}], cv=4)
3 g.fit(x_train, y_train)
4 print("最好分数是:", g.best_score_)
5 print("最好参数是", g.best_params_)

结果截图:

 1 #最好参数训练
 2 clf.fit(x_train, y_train)
 3 #预测
 4 acc = clf.score(x_test, y_test)
 5 print("准确率是:", acc)
 6 #误差分析
 7 y_pred = clf.predict(x_test)
 8 mean_squared_error(y_test, y_pred)
 9 acc_all.append(acc)
10 mse_all.append(mean_squared_error(y_test, y_pred))

结果截图:

 模型测试以及评估

 1 g.score(x_test, y_test)
 2 y_score = clf.fit(x_train, y_train).decision_function(x_test)
 3 fp, tp, threshold = roc_curve(y_test, y_score) 
 4 roc_auc = auc(fp, tp)
 5  
 6 plt.figure(figsize=(10,4))
 7 plt.plot(fp, tp, color='darkorange',
 8          lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
 9 plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
10 plt.xlim([0.0, 1.0])
11 plt.ylim([0.0, 1.05])
12 plt.xlabel('FP')
13 plt.ylabel('TP')
14 plt.title('ROC曲线')
15 plt.legend(loc="best")
16 plt.show()

 

结果截图:

小总结:可见最好参数是0.01,对应的最好分数是0.78,略高于svm。ROC相比于SVM的也略好一些。

 

  随机森林训练

1 clf1 = RandomForestClassifier(n_estimators=500, oob_score=True,verbose=2,n_jobs=4)
2 # g1 = GridSearchCV(clf1, param_grid=[{'n_estimators':[400, 500, 600]}], cv=4)
3 # g1.fit(x_train, y_train)
4 clf1.fit(x_train, y_train)
5 #结果测试
6 acc = clf1.score(x_test, y_test)
7 print("随机森林准确率", acc)
8 # print("最好分数是:", g1.best_score_)
9 # print("最好参数是", g1.best_params_)

500棵树的准确率与运行结果:

 绘制水平直方图评估模型好坏

1 z=zip(clf1.feature_importances_, y_test)
2 z=sorted(z,reverse=True)[:5]
3 x=[i[1] for i in z]
4 width=[i[0] for i in z]
5 
6 plt.figure(figsize=(5, 2))
7 plt.barh(x, width)
8 plt.show()

结果截图:

 

 误差分析

1 #误差分析
2 y_pred = clf1.predict(x_test)
3 mean_squared_error(y_test, y_pred)
4 acc_all.append(acc)
5 mse_all.append(mean_squared_error(y_test, y_pred))

结果截图:

 换用300棵树进行训练

1 #300棵树进行训练
2 clf1 = RandomForestClassifier(n_estimators=300, oob_score=True, verbose=2, n_jobs=4)
3 clf1.fit(x_train, y_train)
4 #结果测试,
5 acc = clf1.score(x_test, y_test)
6 print("随机森林准确率", acc)

结果截图:

 (500参数稍微比300好一些,单影响也不是很大)

绘制水平直方图评估模型

1 z=zip(clf1.feature_importances_, y_test)
2 z=sorted(z,reverse=True)[:5]
3 x=[i[1] for i in z]
4 width=[i[0] for i in z]
5 
6 plt.figure(figsize=(5, 2))
7 plt.barh(x, width)
8 plt.show()

结果截图:

 误差分析:

1 #误差分析
2 y_pred = clf1.predict(x_test)
3 mean_squared_error(y_test, y_pred)

结果截图:

 小总结对于随机森林,主要的参数是树木的多少,因为数据集比较大,交叉验证很花时间。所以,用两次来比较随机森林参数。显然500科树要略好于300颗。

 

  Kmeans 训练以及准确率分析

Kmean聚类

1 k = KMeans(2)
2 k.fit(x_train0, y_train0)
3 #预测,计算准确率
4 y_pred0 = k.predict(x_test0)
5 acc0 = (y_pred0 == y_test0).sum() / len(y_pred0)
6 s = k.score(x_test0, y_test0)
7 print("k近邻分数:", s)
8 print("k近邻准确率:", acc0)

结果截图:

 

1 #误差分析
2 print(mean_squared_error(y_test, y_pred0))
3 
4 acc_all.append(acc0)
5 mse_all.append(mean_squared_error(y_test, y_pred0))

结果截图:

 

对其进行标准化

1 #标准化后
2 k = KMeans(2)
3 k.fit(x_train, y_train)
4 #预测,计算准确率
5 y_pred0 = k.predict(x_test)
6 acc0 = (y_pred0 == y_test).sum() / len(y_pred0)
7 s = k.score(x_test, y_test)
8 print("k近邻分数:", s)
9 print("k近邻准确率:", acc0)

结果截图:

 

1 #误差分析
2 print(mean_squared_error(y_test, y_pred0))
3 
4 acc_all.append(acc0)
5 mse_all.append(mean_squared_error(y_test, y_pred0))

结果截图:

   小总结:x标准化后准确率明显降低。说明了标准化对kmeans的影响是负向的。因为kmeans点越近越近越不利于区分。

最后我们做一个小测试,如果能在二维把数据分开那分类效果自然很好

将数据降到二维观察分析

1 pca1 = PCA(n_components=2)
2 d = pca1.fit_transform(X)
3 
4 plt.figure(figsize=(10,4))
5 plt.scatter(d[:, 0], d[:, 1], c=data.iloc[:, 23])
6 plt.show()

结果截图:

 

明显数据集聚集在一起难以分离,所有此方法不行。

最后:各个模型的结果比较

1 #绘制实际值
2 def autolable(rects):
3     for r in rects:
4         h = r.get_height()
5         plt.text(r.get_x()+r.get_width()/2., 0.98*h, '%s'% float(int(h*1000)/1000))
1 plt.figure(figsize=(8, 3))
2 x = [ "Standard-SVM", "SVM", "Logistics", "RF-500", "RF-300", "Kmeans", "Standard-Kmeans"]
3 rects = plt.bar(x, acc_all)
4 plt.title("accuracy of model")
5 autolable(rects)
6 plt.show()

 结果截图:

 

1 plt.figure(figsize=(8, 3))
2 
3 x = [ "Standard-SVM", "SVM", "Logistics", "RF-500", "RF-300", "Kmeans", "Standard-Kmeans"]
4 rects = plt.bar(x, mse_all)
5 plt.title("MSE of model")
6 autolable(rects)
7 plt.show()

 

 

课题总结:

 本人的几个观点:

     1.一般模型内部参数对结果影响比较小,一般在0.01%的影响。
     2.svm和logistics在标准化后能优化结果,kmeans标准化后结果反而不好。以上三种都受标准化影响。反观随机森林通过对每一个点进行分类无论标准化与否,影响都不是很大。3.PCA降维能使得高维数据降低,提升训练速度,并且得到较好的结果。

本人的收获:

     1.学习了几个新的机器学习模型,丰富了知识面。在动手查阅资料的时候,也了解了几个学习的网站。

     2.针对本次的课题研究:数据预处理对模型的影响非常大,所有以后数据特征处理一定要多加研究,以及处理对某个模型的影响是好是坏,都是很重要的。其次调参,因为调参影响不会太大变化,但也能稍微提高效果。

改进的建议:

     在即将上交课题研究的时候,发现本人在编写的时候存在许多格式的不规范,对于数据的处理也是马马虎虎,导致后面的模型训练遇到很多问题。

 

附上完整代码

  1 #导入相关的库
  2 import numpy as np
  3 import pandas as pd
  4 import matplotlib.pyplot as plt
  5 from sklearn.linear_model import LogisticRegression
  6 from sklearn.model_selection import GridSearchCV
  7 from sklearn.model_selection import train_test_split
  8 from sklearn.metrics import f1_score, auc, roc_curve
  9 from sklearn.svm import LinearSVC
 10 from sklearn.ensemble import RandomForestClassifier
 11 from sklearn.cluster import KMeans
 12 from sklearn.preprocessing import StandardScaler
 13 from sklearn.metrics import mean_absolute_error
 14 from sklearn.metrics import mean_squared_error
 15 from sklearn.ensemble import RandomForestRegressor 
 16 import joblib 
 17 from tqdm import tqdm 
 18 
 19 
 20 #读取文件以及数据分析
 21 
 22 head = 1
 23 index = "ID"
 24 data = pd.read_excel("D:/default of credit card clients.xls", header=head, index_col=index)
 25 #查看前两行数据
 26 data.head(5)
 27 #可见数据有20多个特征,特征值分为0,1
 28 print(data.shape)
 29 data = data.dropna()
 30 print(data.shape)
 31 data.describe()
 32 #可见没有缺失值
 33 
 34 
 35 #数据预处理
 36 
 37 #上面测试过,并未有缺失值,所有不做处理
 38 #设置两个列表用于最终结果绘图
 39 acc_all = []
 40 mse_all = []
 41 #标签值与特征分开
 42 X = data.iloc[:, 0:23]
 43 Y = data.iloc[:, 23]
 44 #数据特征较多,所有进行降维处理,并且不断调参以后发现10会得到较好结果
 45 #pca降维
 46 from sklearn.decomposition import PCA
 47 pca = PCA(n_components=10)
 48 X0 = pca.fit_transform(X)
 49 
 50 #数据标准化
 51 S = StandardScaler()
 52 S.fit(X0)
 53 X = S.transform(X0)
 54 
 55 
 56 #数据集分割
 57 
 58 x_train, x_test, y_train, y_test = train_test_split(X, Y,
 59                                                     train_size=0.8, random_state=999)
 60 print(x_train.shape, y_train.shape)
 61 #对于kmeans不需要标准化的效果更好所所以给出一份数据用于kmeans
 62 x_train0, x_test0, y_train0, y_test0 = train_test_split(X0, Y,
 63                                                     train_size=0.8, random_state=999)
 64 
 65 
 66 #SVM模型训练
 67 
 68 svm = LinearSVC()
 69 svm.fit(x_train, y_train)
 70 #训练未标准化数据
 71 svm0 = LinearSVC()
 72 svm0.fit(x_train0, y_train0)
 73 
 74 
 75 #模型测试以及评估
 76 
 77 #测试集预测准确率
 78 print("标准化svm的准确率", svm.score(x_test, y_test))
 79 y_pred = svm.predict(x_test)
 80 
 81 print("未标准化svm的准确率", svm0.score(x_test0, y_test0))
 82 y_pred0 = svm0.predict(x_test0)
 83 
 84 acc_all.append(svm.score(x_test, y_test))
 85 acc_all.append(svm0.score(x_test0, y_test0))
 86 #误差分析
 87 print(mean_squared_error(y_test, y_pred))
 88 mse_all.append(mean_squared_error(y_test, y_pred))
 89 print(mean_squared_error(y_test, y_pred0))
 90 mse_all.append(mean_squared_error(y_test, y_pred0))
 91 #绘制ROC曲线
 92 y_score = svm.fit(x_train, y_train).decision_function(x_test)
 93 fp, tp, threshold = roc_curve(y_test, y_score) 
 94 roc_auc = auc(fp, tp) 
 95 
 96 plt.figure(figsize=(10,4))
 97 plt.plot(fp, tp, color='darkorange',
 98          lw=2, label='ROC curve (area = %0.2f)' % roc_auc) 
 99 plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
100 plt.xlim([0.0, 1.0])
101 plt.ylim([0.0, 1.05])
102 plt.xlabel('FP')
103 plt.ylabel('TP')
104 plt.title('ROC曲线')
105 plt.legend(loc="best")
106 plt.show()
107 
108 
109 #逻辑回归
110 
111 clf = LogisticRegression(C=0.01)
112 g = GridSearchCV(clf, param_grid=[{'C':[0.01, 0.1, 1, 10]}], cv=4)
113 g.fit(x_train, y_train)
114 print("最好分数是:", g.best_score_)
115 print("最好参数是", g.best_params_)
116 
117 #用最好参数训练
118 clf.fit(x_train, y_train)
119 #预测
120 acc = clf.score(x_test, y_test)
121 print("准确率是:", acc)
122 #误差分析
123 y_pred = clf.predict(x_test)
124 mean_squared_error(y_test, y_pred)
125 acc_all.append(acc)
126 mse_all.append(mean_squared_error(y_test, y_pred))
127 
128 #模型测试以及评估
129 g.score(x_test, y_test)
130 y_score = clf.fit(x_train, y_train).decision_function(x_test)
131 fp, tp, threshold = roc_curve(y_test, y_score) 
132 roc_auc = auc(fp, tp)
133  
134 plt.figure(figsize=(10,4))
135 plt.plot(fp, tp, color='darkorange',
136          lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
137 plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
138 plt.xlim([0.0, 1.0])
139 plt.ylim([0.0, 1.05])
140 plt.xlabel('FP')
141 plt.ylabel('TP')
142 plt.title('ROC曲线')
143 plt.legend(loc="best")
144 plt.show()
145 
146 
147 #随机森林
148 
149 clf1 = RandomForestClassifier(n_estimators=500, oob_score=True,verbose=2,n_jobs=4)
150 # g1 = GridSearchCV(clf1, param_grid=[{'n_estimators':[400, 500, 600]}], cv=4)
151 # g1.fit(x_train, y_train)
152 clf1.fit(x_train, y_train)
153 #结果测试
154 acc = clf1.score(x_test, y_test)
155 print("随机森林准确率", acc)
156 # print("最好分数是:", g1.best_score_)
157 # print("最好参数是", g1.best_params_)
158 
159 z=zip(clf1.feature_importances_, y_test)
160 z=sorted(z,reverse=True)[:5]
161 x=[i[1] for i in z]
162 width=[i[0] for i in z]
163 
164 plt.figure(figsize=(5, 2))
165 plt.barh(x, width)
166 plt.show()
167 
168 #误差分析
169 y_pred = clf1.predict(x_test)
170 mean_squared_error(y_test, y_pred)
171 acc_all.append(acc)
172 mse_all.append(mean_squared_error(y_test, y_pred))
173 
174 
175 #300棵树在进行训练
176 clf1 = RandomForestClassifier(n_estimators=300, oob_score=True, verbose=2, n_jobs=4)
177 clf1.fit(x_train, y_train)
178 #结果测试,
179 acc = clf1.score(x_test, y_test)
180 print("随机森林准确率", acc)
181 #500参数稍微比300好一些,单影响也不是很大
182 
183 z=zip(clf1.feature_importances_, y_test)
184 z=sorted(z,reverse=True)[:5]
185 x=[i[1] for i in z]
186 width=[i[0] for i in z]
187 
188 plt.figure(figsize=(5, 2))
189 plt.barh(x, width)
190 plt.show()
191 
192 #误差分析
193 y_pred = clf1.predict(x_test)
194 mean_squared_error(y_test, y_pred)
195 acc_all.append(acc)
196 mse_all.append(mean_squared_error(y_test, y_pred))
197 
198 
199 #Kmean聚类模型
200 
201 k = KMeans(2)
202 k.fit(x_train0, y_train0)
203 #预测,计算准确率
204 y_pred0 = k.predict(x_test0)
205 acc0 = (y_pred0 == y_test0).sum() / len(y_pred0)
206 s = k.score(x_test0, y_test0)
207 print("k近邻分数:", s)
208 print("k近邻准确率:", acc0)
209 
210 #误差分析
211 print(mean_squared_error(y_test, y_pred0))
212 
213 acc_all.append(acc0)
214 mse_all.append(mean_squared_error(y_test, y_pred0))
215 
216 #标准化后
217 k = KMeans(2)
218 k.fit(x_train, y_train)
219 #预测,计算准确率
220 y_pred0 = k.predict(x_test)
221 acc0 = (y_pred0 == y_test).sum() / len(y_pred0)
222 s = k.score(x_test, y_test)
223 print("k近邻分数:", s)
224 print("k近邻准确率:", acc0)
225 
226 #误差分析
227 print(mean_squared_error(y_test, y_pred0))
228 #标准化后误差更大了
229 
230 acc_all.append(acc0)
231 mse_all.append(mean_squared_error(y_test, y_pred0))
232 
233 
234 #将数据降到二维观察分析
235 
236 pca1 = PCA(n_components=2)
237 d = pca1.fit_transform(X)
238 
239 plt.figure(figsize=(10,4))
240 plt.scatter(d[:, 0], d[:, 1], c=data.iloc[:, 23])
241 plt.show()
242 
243 #绘制实际值
244 def autolable(rects):
245     for r in rects:
246         h = r.get_height()
247         plt.text(r.get_x()+r.get_width()/2., 0.98*h, '%s'% float(int(h*1000)/1000))
248 
249 plt.figure(figsize=(8, 3))
250 x = [ "Standard-SVM", "SVM", "Logistics", "RF-500", "RF-300", "Kmeans", "Standard-Kmeans"]
251 rects = plt.bar(x, acc_all)
252 plt.title("accuracy of model")
253 autolable(rects)
254 plt.show()
255 
256 plt.figure(figsize=(8, 3))
257 
258 x = [ "Standard-SVM", "SVM", "Logistics", "RF-500", "RF-300", "Kmeans", "Standard-Kmeans"]
259 rects = plt.bar(x, mse_all)
260 plt.title("MSE of model")
261 autolable(rects)
262 plt.show()

 

posted @ 2021-12-28 10:47  郑紫婧  阅读(516)  评论(0编辑  收藏  举报