A、随机森林
主要目标就是达到一个对数据的相关性分析
整体的思路就是:
1、数据预处理(表中内容转换、新增列、删除不相关编号等)
2、提取需要处理的数据,绘制热力图(相关性矩阵)
3、数据归一化、调用模型
4、对模型的结果进行处理、分析
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix
from sklearn import metrics
# 1、数据处理 消除空值、归一化、相关性分析
path = "./01.xlsx"
data1 = pd.DataFrame(pd.read_excel(path))
data1 = data1.fillna(1.4)
del data1['编号'] # 删除 ’编号‘ 列 data1['列名']直接获取一整列数据
data1.insert(loc=13, column='是否确诊', value=0) # 插入一列数据
# print(data1)
data2 = pd.DataFrame(pd.read_excel(path, sheet_name="阳性"))
data2 = data2.fillna(1.341)
del data2['编号']
data2.insert(loc=13, column='是否确诊', value=1) # 插入一列数据
# print(data2)
data3 = pd.concat([data1, data2], axis=0).reset_index(drop=True) # 两张表拼接,reset_index(drop=True)去除索引‘编号’
data3.insert(loc=14, column='BMI', value=(data3['体重kg'] / ((data3['身高cm']/100)**2))) # 插入一列数据
# 对性别列进行处理--->将男 女 字符串改成数字表示,以便独热编码
data3.replace('男', 1, inplace=True)
data3.replace('女', 0, inplace=True)
# print(data3) # 两个表拼接在一起---data3
# print(data3.columns)
"""
Index(['性别', '年龄', '身高cm', '体重kg', '潮气量(L) ', '用力肺活量(%)', '中心气道参数(%)',
'FEV1/FVC(%)', '最高呼气流速(%)', '外周气道参数A(%)', '外周气道参数B(%)', '外周气道参数C(%)',
'外周气道参数D(%)', '是否确诊', 'BMI'],
dtype='object')
"""
data_content = data3[['性别', '年龄', '身高cm', '体重kg','BMI', '是否确诊']]
plt.rcParams['font.family'] = ['SimHei'] # 修改matplotlib绘图 中文报错
plt.rcParams['axes.unicode_minus'] = False
plt.figure() # 创建空间
sns.heatmap(data_content.corr()) # 绘制相关图的代码
plt.show()
# 3、使用模型前准备
data_hot = pd.get_dummies(data_content, columns=['性别', '是否确诊']) # get_dummies()将两类变量转成独热编码
# print(dataset.head(5))
standardScaler = StandardScaler() # 标准化函数,如果不需要独热编码,直接调用此行
obj = ['年龄', '身高cm', '体重kg', 'BMI'] # 待归一化的数据
data_hot[obj] = standardScaler.fit_transform(data_hot[obj]) # 实现数据归一化
# print(data_hot.head()) 只打印前面几个
print(data_hot)
# 4、调用模型
# X输入的特征 Y输出的结果 模型根据导入的x 、原本输入的特征的真实结果(是否得病) 和 模型输出的Y(是否得病)比较
x = data_hot.drop(['是否确诊_0', '是否确诊_1'], axis=1) # drop 丢弃跟真实结果相关的值---此处为 是否确诊,其余保留
print(x) # 输入的特征 ['是否确诊_0', '是否确诊_1']内更改真实结果
y = data_hot[['是否确诊_0', '是否确诊_1']]
print(y) # 输入的特征的真实值
# 划分训练集和测试集大小 test_size是训练集的大小 train_test_split固定的函数,传入参数为 所需
# x_train, x_test, y_train, y_test 训练集 测试集输入 输出
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)
# 创建一个随机森林分类器 参数是情况更改
rf = RandomForestClassifier(random_state=42, n_estimators=100)
# 利用训练集样本对分类器模型进行训练拟合 参数为随机森林分类出来的 fit在训练!!!
model = rf.fit(x_train, y_train)
# print(model.predict(x_train))
# print(y_train)
# print(type(model.predict(x_train)))
y_train = np.array(y_train)
xm = confusion_matrix(y_train.argmax(axis=1), model.predict(x_train).argmax(axis=1)) # 混淆矩阵
print('训练集混淆矩阵为:\n', xm)
print('训练集准确率:', metrics.accuracy_score(model.predict(x_train), y_train))
y_test = np.array(y_test)
y_pred = model.predict(x_test)
cm = confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1)) # 混淆矩阵
print('测试集混淆矩阵为:\n', cm)
print('测试集准确率:', metrics.accuracy_score(y_pred, y_test))
B、SVM分类器
整体流程相同,不同点是调用的函数不同,后期再进行学习
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix
from sklearn import metrics
from sklearn import svm
# 1、数据处理 消除空值、归一化、相关性分析
path = "./01.xlsx"
data1 = pd.DataFrame(pd.read_excel(path))
data1 = data1.fillna(1.4)
data1 = data1.loc[0:1600, :]
del data1['编号'] # 删除 ’编号‘ 列 data1['列名']直接获取一整列数据
data1.insert(loc=13, column='是否确诊', value=0) # 插入一列数据
print(data1)
data2 = pd.DataFrame(pd.read_excel(path, sheet_name="阳性"))
data2 = data2.fillna(1.341)
del data2['编号']
data2.insert(loc=13, column='是否确诊', value=1) # 插入一列数据
# print(data2)
data3 = pd.concat([data1, data2], axis=0).reset_index(drop=True) # 两张表拼接,reset_index(drop=True)去除索引‘编号’
data3.insert(loc=14, column='BMI', value=(data3['体重kg'] / ((data3['身高cm']/100)**2))) # 插入一列数据
# 对性别列进行处理--->将男 女 字符串改成数字表示,以便独热编码
data3.replace('男', 1, inplace=True)
data3.replace('女', 0, inplace=True)
data3 = shuffle(data3)
print(data3) # 两个表拼接在一起---data3
# print(data3.columns)
"""
Index(['性别', '年龄', '身高cm', '体重kg', '潮气量(L) ', '用力肺活量(%)', '中心气道参数(%)',
'FEV1/FVC(%)', '最高呼气流速(%)', '外周气道参数A(%)', '外周气道参数B(%)', '外周气道参数C(%)',
'外周气道参数D(%)', '是否确诊', 'BMI'],
dtype='object')
"""
# 仅分析元数据
data_content = data3[['性别', '年龄', '身高cm', '体重kg', 'BMI', '是否确诊']]
# 绘制热力图
# plt.rcParams['font.family'] = ['SimHei'] # 修改matplotlib绘图 中文报错
# plt.rcParams['axes.unicode_minus'] = False
# plt.figure() # 创建空间
# sns.heatmap(data_content.corr()) # 绘制相关图的代码
# plt.show()
# 3、使用模型前准备
# data_hot = pd.get_dummies(data_content, columns=['性别', '是否确诊']) # get_dummies()将两类变量转成独热编码
data_hot = data_content
# print(dataset.head(5))
standardScaler = StandardScaler() # 标准化函数,如果不需要独热编码,直接调用此行
obj = ['年龄', '身高cm', '体重kg', 'BMI'] # 待归一化的数据
data_hot[obj] = standardScaler.fit_transform(data_hot[obj]) # 实现数据归一化
# print(data_hot.head()) 只打印前面几个
print('data_hot\n', data_hot)
# 4、调用模型
# X输入的特征 Y输出的结果 模型根据导入的x 、原本输入的特征的真实结果(是否得病) 和 模型输出的Y(是否得病)比较
x = data_hot.drop(['是否确诊'], axis=1) # drop 丢弃跟真实结果相关的值---此处为 是否确诊,其余保留
print(x) # 输入的特征 ['是否确诊_0', '是否确诊_1']内更改真实结果
y = data_hot[['是否确诊']]
print(y) # 输入的特征的真实值
# 划分训练集和测试集大小 test_size是训练集的大小 train_test_split固定的函数,传入参数为 所需
# x_train, x_test, y_train, y_test 训练集 测试集输入 输出
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
# 创建一个SVM分类器 参数是情况更改
model = svm.SVC() # 创建SVM分类器
# 利用训练集样本对分类器模型进行训练拟合 参数为SVM分类出来的 fit在训练!!!
model = model.fit(x_train, y_train)
print(y_train)
# p_svm = pd.DataFrame(prediction)
# p_svm.to_csv("train_svm.csv", index=False, sep=',')
# print(prediction)
train_pred = model.predict(x_train) # 用测试集做预测
# p_svm = pd.DataFrame(prediction)
# p_svm.to_csv("train_svm.csv", index=False, sep=',')
print('训练集准确率:', metrics.accuracy_score(train_pred, y_train))
# print(y_test)
test_pred = model.predict(x_test)
p_svm = pd.DataFrame(test_pred)
p_svm.to_csv("test_svm.csv", index=False, sep=',')
print('测试集准确率:', metrics.accuracy_score(test_pred, y_test))
C、MLP
整体流程相同,不同点是调用的函数不同,后期再进行学习
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
# from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix
from sklearn import metrics
from sklearn.neural_network import MLPClassifier
# 1、数据处理 消除空值、归一化、相关性分析
path = "./01.xlsx"
data1 = pd.DataFrame(pd.read_excel(path))
data1 = data1.fillna(1.4)
del data1['编号'] # 删除 ’编号‘ 列 data1['列名']直接获取一整列数据
data1.insert(loc=13, column='是否确诊', value=0) # 插入一列数据
# print(data1)
data2 = pd.DataFrame(pd.read_excel(path, sheet_name="阳性"))
data2 = data2.fillna(1.341)
del data2['编号']
data2.insert(loc=13, column='是否确诊', value=1) # 插入一列数据
# print(data2)
data3 = pd.concat([data1, data2], axis=0).reset_index(drop=True) # 两张表拼接,reset_index(drop=True)去除索引‘编号’
data3.insert(loc=14, column='BMI', value=(data3['体重kg'] / ((data3['身高cm']/100)**2))) # 插入一列数据
# 对性别列进行处理--->将男 女 字符串改成数字表示,以便独热编码
data3.replace('男', 1, inplace=True)
data3.replace('女', 0, inplace=True)
# print(data3) # 两个表拼接在一起---data3
# print(data3.columns)
"""
Index(['性别', '年龄', '身高cm', '体重kg', '潮气量(L) ', '用力肺活量(%)', '中心气道参数(%)',
'FEV1/FVC(%)', '最高呼气流速(%)', '外周气道参数A(%)', '外周气道参数B(%)', '外周气道参数C(%)',
'外周气道参数D(%)', '是否确诊', 'BMI'],
dtype='object')
"""
data_content = data3[['性别', '年龄', '身高cm', '体重kg','BMI', '是否确诊']]
plt.rcParams['font.family'] = ['SimHei'] # 修改matplotlib绘图 中文报错
plt.rcParams['axes.unicode_minus'] = False
plt.figure() # 创建空间
sns.heatmap(data_content.corr()) # 绘制相关图的代码
plt.show()
# 3、使用模型前准备
data_hot = pd.get_dummies(data_content, columns=['性别', '是否确诊']) # get_dummies()将两类变量转成独热编码
# print(dataset.head(5))
standardScaler = StandardScaler() # 标准化函数,如果不需要独热编码,直接调用此行
obj = ['年龄', '身高cm', '体重kg', 'BMI'] # 待归一化的数据
data_hot[obj] = standardScaler.fit_transform(data_hot[obj]) # 实现数据归一化
# print(data_hot.head()) 只打印前面几个
print(data_hot)
# 4、调用模型
# X输入的特征 Y输出的结果 模型根据导入的x 、原本输入的特征的真实结果(是否得病) 和 模型输出的Y(是否得病)比较
x = data_hot.drop(['是否确诊_0', '是否确诊_1'], axis=1) # drop 丢弃跟真实结果相关的值---此处为 是否确诊,其余保留
print(x) # 输入的特征 ['是否确诊_0', '是否确诊_1']内更改真实结果
y = data_hot[['是否确诊_0', '是否确诊_1']]
print(y) # 输入的特征的真实值
# 划分训练集和测试集大小 test_size是训练集的大小 train_test_split固定的函数,传入参数为 所需
# x_train, x_test, y_train, y_test 训练集 测试集输入 输出
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)
# 创建一个MLP分类器 参数视情况更改
mlp = MLPClassifier(solver='lbfgs', hidden_layer_sizes=(5, 4), activation='logistic', max_iter=5000)
# 利用训练集样本对分类器模型进行训练拟合 参数为随机森林分类出来的 fit在训练!!!
model = mlp.fit(x_train, y_train)
# print(model.predict(x_train))
# print(y_train)
# print(type(model.predict(x_train)))
y_train = np.array(y_train)
xm = confusion_matrix(y_train.argmax(axis=1), model.predict(x_train).argmax(axis=1)) # 混淆矩阵
print('训练集混淆矩阵为:\n', xm)
print('训练集准确率:', metrics.accuracy_score(model.predict(x_train), y_train))
y_test = np.array(y_test)
y_pred = model.predict(x_test)
cm = confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1)) # 混淆矩阵
print('测试集混淆矩阵为:\n', cm)
print('测试集准确率:', metrics.accuracy_score(y_pred, y_test))