【机器学习,填充数据后使用4种模型进行数据的处理】

对数据进行处理之前首先导入必要的库:

import pandas as pd
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn import metrics
from sklearn.calibration import calibration_curve

然后进行数据的读取,读取的对象就是分别用删除数据行、平均值填充、中位数填充、众数填充四种方法填充数据后保存的excel文件:

'''数据提取'''
train_data = pd.read_excel(r'.//temp_data//训练数据集[删除空数据行].xlsx')
train_data_x = train_data.iloc[:,1:]    #训练数据集的特征
train_data_y = train_data.iloc[:,0]     #训练数据集的测试标签label

test_data = pd.read_excel(r'.//temp_data//测试数据集[删除空数据行].xlsx')
test_data_x = test_data.iloc[:,1:]    #测试数据集的特征
test_data_y = test_data.iloc[:,0]     #测试数据集的测试标签label

result_data = {}#用来保存后面6种算法的结果。

一、删除空数据行

'''#################逻辑回归LR算法实现代码#############################'''

from sklearn.linear_model import LogisticRegression
"""建立最优模型"""
LR_result= {}#用来保存训练之后的结果。
lr = LogisticRegression(C = 10, max_iter = 500,penalty='l2',solver='lbfgs')#逻辑回归的参数,是通过网格搜索算法来实现
lr.fit(train_data_x, train_data_y)


'''测试结果【含训练数据集的测试 + 测试数据集的测试】'''
train_predicted = lr.predict(train_data_x) #训练数据集的预测结果
print('LR的train:\n',metrics.classification_report(train_data_y, train_predicted))
test_predicted = lr.predict(test_data_x) #训练数据集的预测结果
print('LR的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)#digits表示保留有效位数
b = a.split()

LR_result['recall_0'] = float(b[6])   #添加类别为0的召回率
LR_result['recall_1'] = float(b[11])  #添加类别为1的召回率
LR_result['recall_2'] = float(b[16])  #添加类别为2的召回率
LR_result['recall_3'] = float(b[21])  #添加类别为3的召回率
LR_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['LR'] = LR_result#result_data是总体的结果,
print('lr结束')


# '''#################RF算法实现代码#############################'''
from sklearn.ensemble import RandomForestClassifier
RF_result = {}
rf = RandomForestClassifier(bootstrap= False,
                            max_depth=20,
                            max_features='log2',
                            min_samples_leaf= 1,
                            min_samples_split= 2,
                            n_estimators=50,
                            random_state=487)

rf.fit(train_data_x, train_data_y)
train_predicted = rf.predict(train_data_x) #训练数据集的预测结果
test_predicted = rf.predict(test_data_x) #训练数据集的预测结果

print('RF的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果
print('RF的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
rf_test_report = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = rf_test_report.split()

RF_result['recall_0'] = float(b[6])   #添加类别为0的召回率
RF_result['recall_1'] = float(b[11])  #添加类别为1的召回率
RF_result['recall_2'] = float(b[16])  #添加类别为2的召回率
RF_result['recall_3'] = float(b[21])  #添加类别为3的召回率
RF_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['RF'] = RF_result




'''#################SVM算法实现代码#############################'''
from sklearn.svm import SVC
#下面的参数均已通过网格搜索算法调优
SVM_result = {}
svm = SVC(C=1, coef0=0.1, degree= 4, gamma= 1, kernel='poly', probability=True, random_state=100)#c无穷大,则可软间隔为0。不容分错。尝试修改

svm.fit(train_data_x,train_data_y)
test_predicted = svm.predict(test_data_x) #训练数据集的预测结果

print('SVM的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a= metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
print(a)

SVM_result['recall_0'] = float(b[6])   #添加类别为0的召回率
SVM_result['recall_1'] = float(b[11])  #添加类别为1的召回率
SVM_result['recall_2'] = float(b[16])  #添加类别为2的召回率
SVM_result['recall_3'] = float(b[21])  #添加类别为3的召回率
SVM_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['SVM'] = SVM_result





'''#################AdaBoost算法实现代码#############################'''
#XGBoost使用的基学习器是决策树,而AdaBoost可以使用其他各种弱学习器。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

AdaBoost_reslut = {}

# 创建一个决策树分类器作为基础分类器
base_classifier = DecisionTreeClassifier(max_depth=1)

abf = AdaBoostClassifier(algorithm= 'SAMME',
                         base_estimator= base_classifier,
                         n_estimators=200,
                         learning_rate= 1.0,
                         random_state=0)  # 创建AdaBoost分类器# 创建GridSearchCV对象

abf.fit(train_data_x,train_data_y)
train_predicted = abf.predict(train_data_x) #训练数据集的预测结果
print('AdaBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = abf.predict(test_data_x) #训练数据集的预测结果
print('AdaBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

AdaBoost_reslut['recall_0'] = float(b[6])   #添加类别为0的召回率
AdaBoost_reslut['recall_1'] = float(b[11])  #添加类别为1的召回率
AdaBoost_reslut['recall_2'] = float(b[16])  #添加类别为2的召回率
AdaBoost_reslut['recall_3'] = float(b[21])  #添加类别为3的召回率
AdaBoost_reslut['acc'] = float(b[25])*100  #添加accuracy的结果
result_data['AdaBoost'] = AdaBoost_reslut


'''#################GNB算法实现代码#############################'''
from sklearn.naive_bayes import GaussianNB

GNB_result = {}
gnb = GaussianNB() # 创建高斯朴素贝叶斯分类器
gnb.fit(train_data_x,train_data_y)
train_predicted = gnb.predict(train_data_x) #训练数据集的预测结果
print('GNB的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = gnb.predict(test_data_x) #训练数据集的预测结果
print('GNB的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

GNB_result['recall_0'] = float(b[6])   #添加类别为0的召回率
GNB_result['recall_1'] = float(b[11])  #添加类别为1的召回率
GNB_result['recall_2'] = float(b[16])  #添加类别为2的召回率
GNB_result['recall_3'] = float(b[21])  #添加类别为3的召回率
GNB_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['GNB'] = GNB_result



'''#################XGBoost算法实现代码#############################'''
import xgboost as xgb
XGBoost_result = {}
xgb_model = xgb.XGBClassifier(learning_rate=0.05,  # 学习率
    n_estimators=200,  # 决策树数量
    num_class = 5,
    max_depth=7,  # 树的最大深度
    min_child_weight=1,  # 叶子节点中最小的样本权重和
    gamma=0,  # 节点分裂所需的最小损失函数下降值
    subsample=0.6,  # 训练样本的子样本比例
    colsample_bytree=0.8,  # 每棵树随机采样的列数的占比
    objective='multi:softmax',  # 损失函数类型(对于二分类问题)
    seed=0  # 随机数种子
     ) # 创建XGBoost分类器

xgb_model.fit(train_data_x,train_data_y)
train_predicted = xgb_model.predict(train_data_x) #训练数据集的预测结果
print('XGBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = xgb_model.predict(test_data_x) #训练数据集的预测结果
print('XGBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
XGBoost_result['recall_0'] = float(b[6])  #添加类别为0的召回率
XGBoost_result['recall_1'] = float(b[11])  #添加类别为1的召回率
XGBoost_result['recall_2'] = float(b[16])  #添加类别为2的召回率
XGBoost_result['recall_3'] = float(b[21])  #添加类别为3的召回率
XGBoost_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['XGBoost'] = XGBoost_result

import json
# 使用 'w' 模式打开文件,确保如果文件已存在则会被覆盖
result = {}
result['cca fill'] = result_data
with open(r'temp_data/删除数据行result.json', 'w', encoding='utf-8') as file:
    # 使用 json.dump() 方法将字典转换为 JSON 格式并写入文件
    json.dump(result, file, ensure_ascii=False, indent=4)

代码执行结果

在这里插入图片描述

在这里插入图片描述

二、平均值填充

下面三种方法的代码是一样的,只是需要改变读取到的数据对象,以及最后保存的JSON文件的内容。

import pandas as pd
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn import metrics
from sklearn.calibration import calibration_curve

'''数据提取'''
train_data = pd.read_excel(r'.//temp_data//训练数据集[平均值填充].xlsx')
train_data_x = train_data.iloc[:,1:]    #训练数据集的特征
train_data_y = train_data.iloc[:,0]     #训练数据集的测试标签label

test_data = pd.read_excel(r'.//temp_data//测试数据集[平均值填充].xlsx')
test_data_x = test_data.iloc[:,1:]    #测试数据集的特征
test_data_y = test_data.iloc[:,0]     #测试数据集的测试标签label

result_data = {}#用来保存后面6种算法的结果。

from sklearn.linear_model import LogisticRegression
"""建立最优模型"""
LR_result= {}#用来保存训练之后的结果。
lr = LogisticRegression(C = 10, max_iter = 500,penalty='l2',solver='lbfgs')#逻辑回归的参数,是通过网格搜索算法来实现
lr.fit(train_data_x, train_data_y)


'''测试结果【含训练数据集的测试 + 测试数据集的测试】'''
train_predicted = lr.predict(train_data_x) #训练数据集的预测结果
print('LR的train:\n',metrics.classification_report(train_data_y, train_predicted))
test_predicted = lr.predict(test_data_x) #训练数据集的预测结果
print('LR的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)#digits表示保留有效位数
b = a.split()

LR_result['recall_0'] = float(b[6])   #添加类别为0的召回率
LR_result['recall_1'] = float(b[11])  #添加类别为1的召回率
LR_result['recall_2'] = float(b[16])  #添加类别为2的召回率
LR_result['recall_3'] = float(b[21])  #添加类别为3的召回率
LR_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['LR'] = LR_result#result_data是总体的结果,
print('lr结束')


# '''#################RF算法实现代码#############################'''
from sklearn.ensemble import RandomForestClassifier
RF_result = {}
rf = RandomForestClassifier(bootstrap= False,
                            max_depth=20,
                            max_features='log2',
                            min_samples_leaf= 1,
                            min_samples_split= 2,
                            n_estimators=50,
                            random_state=487)

rf.fit(train_data_x, train_data_y)
train_predicted = rf.predict(train_data_x) #训练数据集的预测结果
test_predicted = rf.predict(test_data_x) #训练数据集的预测结果

print('RF的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果
print('RF的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
rf_test_report = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = rf_test_report.split()

RF_result['recall_0'] = float(b[6])   #添加类别为0的召回率
RF_result['recall_1'] = float(b[11])  #添加类别为1的召回率
RF_result['recall_2'] = float(b[16])  #添加类别为2的召回率
RF_result['recall_3'] = float(b[21])  #添加类别为3的召回率
RF_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['RF'] = RF_result




'''#################SVM算法实现代码#############################'''
from sklearn.svm import SVC
#下面的参数均已通过网格搜索算法调优
SVM_result = {}
svm = SVC(C=1, coef0=0.1, degree= 4, gamma= 1, kernel='poly', probability=True, random_state=100)#c无穷大,则可软间隔为0。不容分错。尝试修改

svm.fit(train_data_x,train_data_y)
test_predicted = svm.predict(test_data_x) #训练数据集的预测结果

print('SVM的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a= metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
print(a)

SVM_result['recall_0'] = float(b[6])   #添加类别为0的召回率
SVM_result['recall_1'] = float(b[11])  #添加类别为1的召回率
SVM_result['recall_2'] = float(b[16])  #添加类别为2的召回率
SVM_result['recall_3'] = float(b[21])  #添加类别为3的召回率
SVM_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['SVM'] = SVM_result





'''#################AdaBoost算法实现代码#############################'''
#XGBoost使用的基学习器是决策树,而AdaBoost可以使用其他各种弱学习器。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

AdaBoost_reslut = {}

# 创建一个决策树分类器作为基础分类器
base_classifier = DecisionTreeClassifier(max_depth=1)

abf = AdaBoostClassifier(algorithm= 'SAMME',
                         base_estimator= base_classifier,
                         n_estimators=200,
                         learning_rate= 1.0,
                         random_state=0)  # 创建AdaBoost分类器# 创建GridSearchCV对象

abf.fit(train_data_x,train_data_y)
train_predicted = abf.predict(train_data_x) #训练数据集的预测结果
print('AdaBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = abf.predict(test_data_x) #训练数据集的预测结果
print('AdaBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

AdaBoost_reslut['recall_0'] = float(b[6])   #添加类别为0的召回率
AdaBoost_reslut['recall_1'] = float(b[11])  #添加类别为1的召回率
AdaBoost_reslut['recall_2'] = float(b[16])  #添加类别为2的召回率
AdaBoost_reslut['recall_3'] = float(b[21])  #添加类别为3的召回率
AdaBoost_reslut['acc'] = float(b[25])*100  #添加accuracy的结果
result_data['AdaBoost'] = AdaBoost_reslut


'''#################GNB算法实现代码#############################'''
from sklearn.naive_bayes import GaussianNB

GNB_result = {}
gnb = GaussianNB() # 创建高斯朴素贝叶斯分类器
gnb.fit(train_data_x,train_data_y)
train_predicted = gnb.predict(train_data_x) #训练数据集的预测结果
print('GNB的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = gnb.predict(test_data_x) #训练数据集的预测结果
print('GNB的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

GNB_result['recall_0'] = float(b[6])   #添加类别为0的召回率
GNB_result['recall_1'] = float(b[11])  #添加类别为1的召回率
GNB_result['recall_2'] = float(b[16])  #添加类别为2的召回率
GNB_result['recall_3'] = float(b[21])  #添加类别为3的召回率
GNB_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['GNB'] = GNB_result



'''#################XGBoost算法实现代码#############################'''
import xgboost as xgb
XGBoost_result = {}
xgb_model = xgb.XGBClassifier(learning_rate=0.05,  # 学习率
    n_estimators=200,  # 决策树数量
    num_class = 5,
    max_depth=7,  # 树的最大深度
    min_child_weight=1,  # 叶子节点中最小的样本权重和
    gamma=0,  # 节点分裂所需的最小损失函数下降值
    subsample=0.6,  # 训练样本的子样本比例
    colsample_bytree=0.8,  # 每棵树随机采样的列数的占比
    objective='multi:softmax',  # 损失函数类型(对于二分类问题)
    seed=0  # 随机数种子
     ) # 创建XGBoost分类器

xgb_model.fit(train_data_x,train_data_y)
train_predicted = xgb_model.predict(train_data_x) #训练数据集的预测结果
print('XGBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = xgb_model.predict(test_data_x) #训练数据集的预测结果
print('XGBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
XGBoost_result['recall_0'] = float(b[6])  #添加类别为0的召回率
XGBoost_result['recall_1'] = float(b[11])  #添加类别为1的召回率
XGBoost_result['recall_2'] = float(b[16])  #添加类别为2的召回率
XGBoost_result['recall_3'] = float(b[21])  #添加类别为3的召回率
XGBoost_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['XGBoost'] = XGBoost_result

import json
# 使用 'w' 模式打开文件,确保如果文件已存在则会被覆盖
result = {}
result['mean fill'] = result_data
with open(r'temp_data/平均值填充result.json', 'w', encoding='utf-8') as file:
    # 使用 json.dump() 方法将字典转换为 JSON 格式并写入文件
    json.dump(result, file, ensure_ascii=False, indent=4)

执行结果

在这里插入图片描述
在这里插入图片描述

三、中位数填充

import pandas as pd
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn import metrics
from sklearn.calibration import calibration_curve

'''数据提取'''
train_data = pd.read_excel(r'.//temp_data//训练数据集[中位数填充].xlsx')
train_data_x = train_data.iloc[:,1:]    #训练数据集的特征
train_data_y = train_data.iloc[:,0]     #训练数据集的测试标签label

test_data = pd.read_excel(r'.//temp_data//测试数据集[中位数填充].xlsx')
test_data_x = test_data.iloc[:,1:]    #测试数据集的特征
test_data_y = test_data.iloc[:,0]     #测试数据集的测试标签label

result_data = {}#用来保存后面6种算法的结果。

from sklearn.linear_model import LogisticRegression
"""建立最优模型"""
LR_result= {}#用来保存训练之后的结果。
lr = LogisticRegression(C = 10, max_iter = 500,penalty='l2',solver='lbfgs')#逻辑回归的参数,是通过网格搜索算法来实现
lr.fit(train_data_x, train_data_y)


'''测试结果【含训练数据集的测试 + 测试数据集的测试】'''
train_predicted = lr.predict(train_data_x) #训练数据集的预测结果
print('LR的train:\n',metrics.classification_report(train_data_y, train_predicted))
test_predicted = lr.predict(test_data_x) #训练数据集的预测结果
print('LR的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)#digits表示保留有效位数
b = a.split()

LR_result['recall_0'] = float(b[6])   #添加类别为0的召回率
LR_result['recall_1'] = float(b[11])  #添加类别为1的召回率
LR_result['recall_2'] = float(b[16])  #添加类别为2的召回率
LR_result['recall_3'] = float(b[21])  #添加类别为3的召回率
LR_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['LR'] = LR_result#result_data是总体的结果,
print('lr结束')


# '''#################RF算法实现代码#############################'''
from sklearn.ensemble import RandomForestClassifier
RF_result = {}
rf = RandomForestClassifier(bootstrap= False,
                            max_depth=20,
                            max_features='log2',
                            min_samples_leaf= 1,
                            min_samples_split= 2,
                            n_estimators=50,
                            random_state=487)

rf.fit(train_data_x, train_data_y)
train_predicted = rf.predict(train_data_x) #训练数据集的预测结果
test_predicted = rf.predict(test_data_x) #训练数据集的预测结果

print('RF的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果
print('RF的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
rf_test_report = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = rf_test_report.split()

RF_result['recall_0'] = float(b[6])   #添加类别为0的召回率
RF_result['recall_1'] = float(b[11])  #添加类别为1的召回率
RF_result['recall_2'] = float(b[16])  #添加类别为2的召回率
RF_result['recall_3'] = float(b[21])  #添加类别为3的召回率
RF_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['RF'] = RF_result




'''#################SVM算法实现代码#############################'''
from sklearn.svm import SVC
#下面的参数均已通过网格搜索算法调优
SVM_result = {}
svm = SVC(C=1, coef0=0.1, degree= 4, gamma= 1, kernel='poly', probability=True, random_state=100)#c无穷大,则可软间隔为0。不容分错。尝试修改

svm.fit(train_data_x,train_data_y)
test_predicted = svm.predict(test_data_x) #训练数据集的预测结果

print('SVM的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a= metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
print(a)

SVM_result['recall_0'] = float(b[6])   #添加类别为0的召回率
SVM_result['recall_1'] = float(b[11])  #添加类别为1的召回率
SVM_result['recall_2'] = float(b[16])  #添加类别为2的召回率
SVM_result['recall_3'] = float(b[21])  #添加类别为3的召回率
SVM_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['SVM'] = SVM_result





'''#################AdaBoost算法实现代码#############################'''
#XGBoost使用的基学习器是决策树,而AdaBoost可以使用其他各种弱学习器。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

AdaBoost_reslut = {}

# 创建一个决策树分类器作为基础分类器
base_classifier = DecisionTreeClassifier(max_depth=1)

abf = AdaBoostClassifier(algorithm= 'SAMME',
                         base_estimator= base_classifier,
                         n_estimators=200,
                         learning_rate= 1.0,
                         random_state=0)  # 创建AdaBoost分类器# 创建GridSearchCV对象

abf.fit(train_data_x,train_data_y)
train_predicted = abf.predict(train_data_x) #训练数据集的预测结果
print('AdaBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = abf.predict(test_data_x) #训练数据集的预测结果
print('AdaBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

AdaBoost_reslut['recall_0'] = float(b[6])   #添加类别为0的召回率
AdaBoost_reslut['recall_1'] = float(b[11])  #添加类别为1的召回率
AdaBoost_reslut['recall_2'] = float(b[16])  #添加类别为2的召回率
AdaBoost_reslut['recall_3'] = float(b[21])  #添加类别为3的召回率
AdaBoost_reslut['acc'] = float(b[25])*100  #添加accuracy的结果
result_data['AdaBoost'] = AdaBoost_reslut


'''#################GNB算法实现代码#############################'''
from sklearn.naive_bayes import GaussianNB

GNB_result = {}
gnb = GaussianNB() # 创建高斯朴素贝叶斯分类器
gnb.fit(train_data_x,train_data_y)
train_predicted = gnb.predict(train_data_x) #训练数据集的预测结果
print('GNB的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = gnb.predict(test_data_x) #训练数据集的预测结果
print('GNB的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

GNB_result['recall_0'] = float(b[6])   #添加类别为0的召回率
GNB_result['recall_1'] = float(b[11])  #添加类别为1的召回率
GNB_result['recall_2'] = float(b[16])  #添加类别为2的召回率
GNB_result['recall_3'] = float(b[21])  #添加类别为3的召回率
GNB_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['GNB'] = GNB_result



'''#################XGBoost算法实现代码#############################'''
import xgboost as xgb
XGBoost_result = {}
xgb_model = xgb.XGBClassifier(learning_rate=0.05,  # 学习率
    n_estimators=200,  # 决策树数量
    num_class = 5,
    max_depth=7,  # 树的最大深度
    min_child_weight=1,  # 叶子节点中最小的样本权重和
    gamma=0,  # 节点分裂所需的最小损失函数下降值
    subsample=0.6,  # 训练样本的子样本比例
    colsample_bytree=0.8,  # 每棵树随机采样的列数的占比
    objective='multi:softmax',  # 损失函数类型(对于二分类问题)
    seed=0  # 随机数种子
     ) # 创建XGBoost分类器

xgb_model.fit(train_data_x,train_data_y)
train_predicted = xgb_model.predict(train_data_x) #训练数据集的预测结果
print('XGBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = xgb_model.predict(test_data_x) #训练数据集的预测结果
print('XGBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
XGBoost_result['recall_0'] = float(b[6])  #添加类别为0的召回率
XGBoost_result['recall_1'] = float(b[11])  #添加类别为1的召回率
XGBoost_result['recall_2'] = float(b[16])  #添加类别为2的召回率
XGBoost_result['recall_3'] = float(b[21])  #添加类别为3的召回率
XGBoost_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['XGBoost'] = XGBoost_result

import json
# 使用 'w' 模式打开文件,确保如果文件已存在则会被覆盖
result = {}
result['median fill'] = result_data
with open(r'temp_data/中位数填充result.json', 'w', encoding='utf-8') as file:
    # 使用 json.dump() 方法将字典转换为 JSON 格式并写入文件
    json.dump(result, file, ensure_ascii=False, indent=4)

执行结果

在这里插入图片描述
在这里插入图片描述

四、众数填充

import pandas as pd
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn import metrics
from sklearn.calibration import calibration_curve

'''数据提取'''
train_data = pd.read_excel(r'.//temp_data//训练数据集[众数填充].xlsx')
train_data_x = train_data.iloc[:,1:]    #训练数据集的特征
train_data_y = train_data.iloc[:,0]     #训练数据集的测试标签label

test_data = pd.read_excel(r'.//temp_data//测试数据集[众数填充].xlsx')
test_data_x = test_data.iloc[:,1:]    #测试数据集的特征
test_data_y = test_data.iloc[:,0]     #测试数据集的测试标签label

result_data = {}#用来保存后面6种算法的结果。

from sklearn.linear_model import LogisticRegression
"""建立最优模型"""
LR_result= {}#用来保存训练之后的结果。
lr = LogisticRegression(C = 10, max_iter = 500,penalty='l2',solver='lbfgs')#逻辑回归的参数,是通过网格搜索算法来实现
lr.fit(train_data_x, train_data_y)


'''测试结果【含训练数据集的测试 + 测试数据集的测试】'''
train_predicted = lr.predict(train_data_x) #训练数据集的预测结果
print('LR的train:\n',metrics.classification_report(train_data_y, train_predicted))
test_predicted = lr.predict(test_data_x) #训练数据集的预测结果
print('LR的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)#digits表示保留有效位数
b = a.split()

LR_result['recall_0'] = float(b[6])   #添加类别为0的召回率
LR_result['recall_1'] = float(b[11])  #添加类别为1的召回率
LR_result['recall_2'] = float(b[16])  #添加类别为2的召回率
LR_result['recall_3'] = float(b[21])  #添加类别为3的召回率
LR_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['LR'] = LR_result#result_data是总体的结果,
print('lr结束')


# '''#################RF算法实现代码#############################'''
from sklearn.ensemble import RandomForestClassifier
RF_result = {}
rf = RandomForestClassifier(bootstrap= False,
                            max_depth=20,
                            max_features='log2',
                            min_samples_leaf= 1,
                            min_samples_split= 2,
                            n_estimators=50,
                            random_state=487)

rf.fit(train_data_x, train_data_y)
train_predicted = rf.predict(train_data_x) #训练数据集的预测结果
test_predicted = rf.predict(test_data_x) #训练数据集的预测结果

print('RF的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果
print('RF的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
rf_test_report = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = rf_test_report.split()

RF_result['recall_0'] = float(b[6])   #添加类别为0的召回率
RF_result['recall_1'] = float(b[11])  #添加类别为1的召回率
RF_result['recall_2'] = float(b[16])  #添加类别为2的召回率
RF_result['recall_3'] = float(b[21])  #添加类别为3的召回率
RF_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['RF'] = RF_result




'''#################SVM算法实现代码#############################'''
from sklearn.svm import SVC
#下面的参数均已通过网格搜索算法调优
SVM_result = {}
svm = SVC(C=1, coef0=0.1, degree= 4, gamma= 1, kernel='poly', probability=True, random_state=100)#c无穷大,则可软间隔为0。不容分错。尝试修改

svm.fit(train_data_x,train_data_y)
test_predicted = svm.predict(test_data_x) #训练数据集的预测结果

print('SVM的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a= metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
print(a)

SVM_result['recall_0'] = float(b[6])   #添加类别为0的召回率
SVM_result['recall_1'] = float(b[11])  #添加类别为1的召回率
SVM_result['recall_2'] = float(b[16])  #添加类别为2的召回率
SVM_result['recall_3'] = float(b[21])  #添加类别为3的召回率
SVM_result['acc'] = float(b[25]) #添加accuracy的结果
result_data['SVM'] = SVM_result





'''#################AdaBoost算法实现代码#############################'''
#XGBoost使用的基学习器是决策树,而AdaBoost可以使用其他各种弱学习器。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

AdaBoost_reslut = {}

# 创建一个决策树分类器作为基础分类器
base_classifier = DecisionTreeClassifier(max_depth=1)

abf = AdaBoostClassifier(algorithm= 'SAMME',
                         base_estimator= base_classifier,
                         n_estimators=200,
                         learning_rate= 1.0,
                         random_state=0)  # 创建AdaBoost分类器# 创建GridSearchCV对象

abf.fit(train_data_x,train_data_y)
train_predicted = abf.predict(train_data_x) #训练数据集的预测结果
print('AdaBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = abf.predict(test_data_x) #训练数据集的预测结果
print('AdaBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

AdaBoost_reslut['recall_0'] = float(b[6])   #添加类别为0的召回率
AdaBoost_reslut['recall_1'] = float(b[11])  #添加类别为1的召回率
AdaBoost_reslut['recall_2'] = float(b[16])  #添加类别为2的召回率
AdaBoost_reslut['recall_3'] = float(b[21])  #添加类别为3的召回率
AdaBoost_reslut['acc'] = float(b[25])*100  #添加accuracy的结果
result_data['AdaBoost'] = AdaBoost_reslut


'''#################GNB算法实现代码#############################'''
from sklearn.naive_bayes import GaussianNB

GNB_result = {}
gnb = GaussianNB() # 创建高斯朴素贝叶斯分类器
gnb.fit(train_data_x,train_data_y)
train_predicted = gnb.predict(train_data_x) #训练数据集的预测结果
print('GNB的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = gnb.predict(test_data_x) #训练数据集的预测结果
print('GNB的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()

GNB_result['recall_0'] = float(b[6])   #添加类别为0的召回率
GNB_result['recall_1'] = float(b[11])  #添加类别为1的召回率
GNB_result['recall_2'] = float(b[16])  #添加类别为2的召回率
GNB_result['recall_3'] = float(b[21])  #添加类别为3的召回率
GNB_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['GNB'] = GNB_result



'''#################XGBoost算法实现代码#############################'''
import xgboost as xgb
XGBoost_result = {}
xgb_model = xgb.XGBClassifier(learning_rate=0.05,  # 学习率
    n_estimators=200,  # 决策树数量
    num_class = 5,
    max_depth=7,  # 树的最大深度
    min_child_weight=1,  # 叶子节点中最小的样本权重和
    gamma=0,  # 节点分裂所需的最小损失函数下降值
    subsample=0.6,  # 训练样本的子样本比例
    colsample_bytree=0.8,  # 每棵树随机采样的列数的占比
    objective='multi:softmax',  # 损失函数类型(对于二分类问题)
    seed=0  # 随机数种子
     ) # 创建XGBoost分类器

xgb_model.fit(train_data_x,train_data_y)
train_predicted = xgb_model.predict(train_data_x) #训练数据集的预测结果
print('XGBoost的train:\n',metrics.classification_report(train_data_y, train_predicted)) #打印训练数据集的测试结果

test_predicted = xgb_model.predict(test_data_x) #训练数据集的预测结果
print('XGBoost的test:\n',metrics.classification_report(test_data_y, test_predicted)) #打印训练数据集的测试结果
a = metrics.classification_report(test_data_y, test_predicted,digits=6)
b = a.split()
XGBoost_result['recall_0'] = float(b[6])  #添加类别为0的召回率
XGBoost_result['recall_1'] = float(b[11])  #添加类别为1的召回率
XGBoost_result['recall_2'] = float(b[16])  #添加类别为2的召回率
XGBoost_result['recall_3'] = float(b[21])  #添加类别为3的召回率
XGBoost_result['acc'] = float(b[25])  #添加accuracy的结果
result_data['XGBoost'] = XGBoost_result

import json
# 使用 'w' 模式打开文件,确保如果文件已存在则会被覆盖
result = {}
result['mode fill'] = result_data
with open(r'temp_data/众数填充result.json', 'w', encoding='utf-8') as file:
    # 使用 json.dump() 方法将字典转换为 JSON 格式并写入文件
    json.dump(result, file, ensure_ascii=False, indent=4)

执行结果

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值