泰迪杯数据挖掘挑战赛—机器学习(三)

机器学习(三)

数据处理完之后,就可以进行机器学习了

在处理A题时,我们小组主要是采用了两种机器学习的方法。逻辑回归与KNN算法。

在上一篇文章中,我已经说过了需要选取一个指标来评判选择的机器学习模型的好坏。其中一个方法是使用混淆矩阵,一般是选择混淆矩阵中的准确率来作为模型的评判标准。但是这次A题给定的数据太过于失衡,虽然做了数据不平衡处理,但是在训练模型的时候依然会有影响。

比如说:训练集中有1000个公司是非造假公司,10个公司是造假公司;测试集有100个样本,其中有10个造假公司。将训练集通过过采样的方法调整到了1000个非造假公司和1000个造假公司,然后将调整过后的训练集去训练模型,然后将训练好的模型去预测测试集中的100个样本中的造假公司。预测出来的结果可能会是100个测试集中有80个是非造假公司和20个造假公司,预测的80个非造假公司中可能会有70个是预测对的,预测的20个造假公司中可能会有5个是预测的对的,那么模型的准确率是75%,这个准确率已经很高了。但是这个模型依然不是很合适,因为题目要求是预测造假公司的数量,而这个的准确率却只有5%,这个是很低的了。所以需要另选指标来判断模型的好坏。

给出代码:

#导入KNeighborsClassifier分类器
from sklearn.neighbors import KNeighborsClassifier as KNeig
#导入accuracy_score 计算模型的准确性
from sklearn.metrics import accuracy_score  as acc_s
import pandas as pd
from collections import Counter
from sklearn.metrics import confusion_matrix
#导入过采样数据
x_train = pd.read_excel("x_train_smote.xlsx")
y_train = pd.read_excel("y_train_smote.xlsx")
x_test = pd.read_excel("x_test.xlsx")
y_test = pd.read_excel("y_test.xlsx")
#第六年公司数据
test_true = pd.read_excel("预测_30.xlsx")
test_true1 = test_true.iloc[:,1:-1]

x_train = x_train.drop(["Unnamed: 0"],axis=1)
y_train = y_train.drop(["Unnamed: 0"],axis=1)
x_test = x_test.drop(["Unnamed: 0"],axis=1)
y_test = y_test.drop(["Unnamed: 0"],axis=1)

#实例化KNN模型,并设置超级参数 algorithm = 'kd_tree'
knn_model = KNeig(n_neighbors = 2,algorithm = 'kd_tree')

#基于训练集训练处集体模型
knn_model.fit(x_train,y_train)

#将上一步中已训练出来的具体模型用于测试集中的特征举证,预测对应的目标向量
y_predictSet = knn_model.predict(x_test.values) # y 的预测集

#真正预测制造业公司第六年数据
y_pred_true = knn_model.predict(test_true1.values)

#查看模型的准确性
result = acc_s(y_test,y_predictSet)
#打印混淆矩阵
cnf_m =confusion_matrix(y_test,y_predictSet)
y_pred_true = pd.DataFrame(y_pred_true)
y_predictSet = pd.DataFrame(y_predictSet)

#将公司代码 与 是否造假 合并在一起
result = pd.concat([test_true["TICKER_SYMBOL"],y_pred_true[0]],axis=1)
#更改列名为FLAG
result = result.rename(columns={0:"FLAG"})

#导出结果
result.to_csv("manuf_result.csv",index=False)

print('预测值制造业造假公司的数量:{}'.format(Counter(y_predictSet[0])))
print('真实值制造业造假公司的数量:{}'.format(Counter(y_test['FLAG'])))
print('第六年制造业造假公司的数量:{}'.format(Counter(y_pred_true[0])))
print("准确率:",(cnf_m[0][0]+cnf_m[1][1])/sum(sum(cnf_m)))
print("召回率:",(cnf_m[0][0])/(cnf_m[0][0]+cnf_m[1][0]))
print("误杀率:",(cnf_m[0][1])/sum(sum(cnf_m)))

总结

在数理数据挖掘时,总的来说可以分为两步:1.数据的预处理 2.模型建立(或者机器学习)。数据的预处理是数据挖掘的一个非常关键的步骤,数据处理的好坏可能会直接影响你后面机器学习的一个结果。所以大家在进行数据预处理时,一定要认真仔细。模型建立,就需要大家去试不同的模型了,根据选择的评判指标去判断选择的模型的好坏。。。。。
数据挖掘完结啦!!!希望这几篇文章能够帮助大家,加油!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Champion.XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值