【深度学习入门项目】基于决策树的威斯康辛乳腺癌肿瘤预测

基于威斯康辛乳腺癌数据集,采用决策树的方法进行肿瘤预测。

导入所需库

import pandas as pd 
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.metrics import plot_confusion_matrix

数据加载和查看

data = pd.read_csv("data_lib1.csv")
data.info()

# display all lines without truncation or breaking
pd.set_option('display.max_columns', None)
pd.options.display.width = None

# default is 5 pieces of data, can change numbers
# here show the 10 pieces of data
print(data.head(10))
print(data.tail(10))

数据预处理

# Check the duplicated data and remove
print(data.duplicated())
data.drop_duplicates(inplace=True)
print(data.duplicated())

# Missing data checking and filling
print(data.isnull())
print(data.isnull().sum())
print(((data.isnull().sum()) / data.shape[0])
      .map(lambda x: "{:.2%}".format(x)))
data.interpolate(method="linear", limit_direction="both", inplace=True)

# Label Encoder
data['diagnosis'] = data['diagnosis'].replace(['M', 'B'], [1, 0])

# Features Visualization 

# Correlation Coefficient Heatmap
features = data.iloc[:, 2:]
sns.heatmap(round(features.corr(), 2),
            cmap="YlGnBu", linewidth=0.5,
            annot=True, annot_kws={"fontsize": 10})
plt.title('Breast Cancer Feature Correlation')
plt.xticks(fontsize=8)
plt.yticks(fontsize=8)
plt.savefig("heatmap.png", dpi=200, bbox_inches='tight')

# Pairplot figure for each pair of feature
feature = data.iloc[:, 1:] # Select data exclude id
sns.pairplot(feature, hue="diagnosis")
plt.savefig("feature.png", dpi=200, bbox_inches='tight')

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

# Save and store the pre-processed dataset
data.to_csv("pre_processed_dataset.csv", index=False)

数据分割

features_mean = list(data.columns[2:])
train, test = train_test_split(data, test_size=0.3, random_state=1)

# Select the value of feature as training and test data
train_X = train[features_mean]
train_Y = train['diagnosis']
test_X = test[features_mean]
test_Y = test['diagnosis']

# Normalize data using Z-Score 
ss = StandardScaler()
train_X = ss.fit_transform(train_X)
test_X = ss.transform(test_X)

模型构建

print("****** Decision Tree ******")
model_DecisionTree = tree.DecisionTreeClassifier() #加载决策树模型

模型训练

model_DecisionTree.fit(train_X, train_Y)

模型预测

prediction_DecisionTree = model_DecisionTree.predict(test_X)

模型评估

 分别导入 sklearn 的 metricsmetrics 不同的标准
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
print("Accuracy:  %.4f" % accuracy_score(test_Y, prediction_DecisionTree) )
print("Presition: %.4f" % precision_score(test_Y, prediction_DecisionTree, pos_label= 1) )
print("Recall:    %.4f" % recall_score(test_Y, prediction_DecisionTree, pos_label= 1) )
print("F1-Score:  %.4f" % f1_score(test_Y, prediction_DecisionTree, pos_label= 1) )

Accuracy: 0.8713
Presition: 0.8254
Recall: 0.8254
F1-Score: 0.8254

可视化结果

# 利用 plot_confusion_matrix 函数将结果可视化
plt.figure(figsize=(8, 6))
plot_confusion_matrix(model_DecisionTree, test_X, test_Y, cmap=plt.cm.Blues, normalize='true')

plt.title('Confusion Matrix for Decision Tree')
plt.savefig("ConfusionMatrix_DecisionTree.png")

在这里插入图片描述

参数调优

1.criterion

该参数对应的三个函数对应我们上文讲过的信息增益,增益率和基尼系数,每个函数对应的评价指标有所不同,有各自的特点。接下来我们尝试将该参数进行更换为信息增益–entropy。

# 更换 criterion 参数
# 进行评估并输出准确率
# 创建决策树分类器,将 criterion 参数设置为 entropy
model_DecisionTree = tree.DecisionTreeClassifier(criterion='entropy') #加载决策树模型
model_DecisionTree.fit(train_X, train_Y)
prediction_DecisionTree = model_DecisionTree.predict(test_X)
print("Accuracy:  %.4f" % accuracy_score(test_Y, prediction_DecisionTree) )

Accuracy: 0.8830

2.max_depth

该参数为树的最大深度,当样本中的特征较多时,设置适当的最大深度可以防止模型过拟合。接下来我们将尝试调整max_depth这个参数以达到模型更好的效果。

# 更换 max_depth 参数
# 进行评估并输出准确率
max_depth_values = [2, 3, 5, 7, 10]

for depth in max_depth_values:

    model_DecisionTree = tree.DecisionTreeClassifier(max_depth= depth) #加载决策树模型
    model_DecisionTree.fit(train_X, train_Y)
    prediction_DecisionTree = model_DecisionTree.predict(test_X)
    print("Accuracy:  %.4f" % accuracy_score(test_Y, prediction_DecisionTree) )

Accuracy: 0.8889
Accuracy: 0.8655
Accuracy: 0.9123
Accuracy: 0.8596
Accuracy: 0.8947

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值