1.乳腺癌数据集简介
乳腺癌数据集包含了美国威斯康星州记录的569个病人的乳腺癌的病情,包含30个维度的生理指标数据(特征),以及乳腺癌是恶性还是良性的标签。因为这是一个二分类问题, 也叫二类判别数据集。
2.实战任务
这数据主要包含569个样本。每个样本有30个特征(30个生理指标数据)和1个标签 (良性还是恶性)。对于本次任务,并不需要了解30个生理指标的含义。只要知道,这30个指标和恶性、良性之间存在某种关联。
3.思路
解决思路非常简单,对于这种大数据问题(对于几百万的数据来说流程类似),主要有5个步骤:
(1)了解数据集,探索数据;
(2)特征工程;
(3)构建模型;
(4)训练模型;
(5)用测试集来评估模型。
注意:这个流程是主要的流程步骤,但不是绝对的。在下一个实战中,会讲解如何使 用模型融合,来增强整体模型的泛化能力。
泛化能力 :泛化能力是机器学习中一个非常重要的概念,它指的是模型对于在训练过程中未曾见过的数据的表现能力。
4.废话不多说直接上代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import pyplot
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.preprocessing import LabelEncoder# 读取数据
breast_cancer_data = pd.read_csv("D:\\breast_data.csv",header=None,names=['C_D', 'C_T', 'U_C_Si', 'U_C_Sh', 'M_A', 'S_E_C_S', 'B_N', 'B_C', 'N_N', 'M', 'Class']
)# 查看维度
print('查看维度:')
print(breast_cancer_data.shape)# 查看数据
print('查看数据')
print(breast_cancer_data.head(25))# 数据统计描述
print('数据统计描述')
print(breast_cancer_data.describe())# 数据分布情况
print("数据分布情况")
print(breast_cancer_data.groupby('Class').size())#按照'class'列的值进行分组,并计算每个组的元素数量
#缺失数据处理
#计算B_N列的平均值,忽略问号
mean_value=breast_cancer_data[breast_cancer_data["B_N"]!="?"].astype(int)["B_N"].mean()
#astype更改类型
#用计算出的平均值替换问号。并转换为整数类型
breast_cancer_data['B_N']=breast_cancer_data["B_N"].replace("?",mean_value).astype(int)
#评估算法
X=breast_cancer_data.iloc[:,1:9]#iloc特征列选取
Y=breast_cancer_data['Class']#目标列
X_train,X_validation,y_train,y_validation=train_test_split(X,Y,test_size=0.2,random_state=7)
'''test_size=0.2: 指定测试集占总数据集的比例为20%。这意味着剩余的80%将被用作训练集
random_state=7: 随机数生成器的种子。设置这个参数可以确保每次分割数据集时都能得到相同的结果,这对于实验的可重复性很重要
随机数种子可以是任何整数值,但通常选择一个固定的数字,如0、7、42等,这些数字在编程社区中被广泛接受作为默认值选择哪个数字作为种子并没有严格的规则,重要的是保持一致性,以便在需要时能够复现结果'''
#使用knn算法
knn=KNeighborsClassifier()
knn.fit(X_train,y_train)
predictions=knn.predict(X_validation)#X_validation: 这是验证集的特征数据,模型将使用这些数据来生成预测结果
print('使用knn算法的精确度:',accuracy_score(y_validation,predictions))#y_validation: 这是验证集的真实标签,即模型预测之前已知的正确答案
print('混淆矩阵:\n',confusion_matrix(y_validation,predictions))#这是模型对验证集X_validation的预测结果
print('分类报告:\n',classification_report(y_validation,predictions))
运行结果
- 精确度(Precision):对于每个类别,表示为正类别的预测中,有多少是正确的
- 召回率(Recall):也称为真正率或灵敏度,表示为每个类别,实际为正类别的样本中,有多少被正确预测。
- F1 分数(F1 Score):精确度和召回率的调和平均值,是一个综合考虑精确度和召回率的性能指标。
- 支持度(Support):每个类别的实际出现次数
Sklearn 库的全称是 Scikit-learn, 是一种机器学习的工具。可以简单高效地进行数据 挖掘,快速地调用常见的数据分析工具。 pandas和numpy一般同时使用,不单独使用。
5.优化:#一个关于警告的库
import warnings
井让本代码不再弹出任何警告
warnings.filterwarnings("igmore")
warning 不影响程序运行,但是总是弹出来也使人心神不宁。这个语句可以忽视所有的 warning,这样就不会在代码中看到任何的warning了,这是一个小技巧。但是建议大家在有时间且有能力的情况下,看一下warning 打印出的信息。信息一般是,例如某个语法将会在未来某个版本中作废,请使用某语句来代替等。
接下来是分步骤讲解,光想要代码的小伙伴可以忽略不看了,想了解更多的小伙伴可以看一下。
优化:用剪枝增强决策树的繁华能力,修改决策树。加大最大深度的设置
过拟合:指的是模型在训练数据上表现得非常好,但是对于未见过的新数据,其预测能力却很差
决策树剪枝:决策树剪枝是防止决策树过拟合的一种技术。在决策树的构建过程中,剪枝有助于减少树的复杂度,提高模型的泛化能力。
探索数据
探索数据就是查看数据的大小、维度等特征。为了将数据整合整理,建议将数据都用 Pandas 的 dataframe格式存储起来,这样操作快速,可视化方便。
决策树模型
在训练之前,需要划分数据集和测试集。把数据集中的30%作为测试集来验证模型的效果。
df_train 是要被划分的特征;df_target 是对应特征的标签,也就是label。test_size是数据集中,把多少划分成test,多少划分成train。random_state是设定随机种子,因为这个划分是随机在数据集中选取30%的数据作为test(不是前30%也不是后30%而是随机选取),因此每一次运行代码可能得到的测试集不 一 样,这样就难以重复运行同样的代码来改进模型。因此通过设定 random_state, 让每一次的随机都是相同的随机。这个划分不仅仅可以用于划分测试集和训练集,还可以用来分割训练集来实现 多模型,增强泛化能力。
例如,假设现在已经有的训练集和测试集。可以再把训练集对半分成训练集1和训练集2。在训练模型的时候,可以一个用训练集1进行训练, 一个用训练集2进行训练,在验证模型的时候分别把测试机输入两个模型,然后将结果取平均值。这样泛化能力会增强。