简单记录一下从 zoodG顶真(wjd)那学到的数模处理

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))


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江月年年只相似Xuan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值