(填空题, 25分)数据集breast-cancer.csv记录了一批曾经罹患乳腺癌患者的数据。每个样本包含下列字段(第1个字段是标签字段,其余为特征字段):
class:分类标签,共2类。1代表复发,0代表没有复发。
age:年龄,共六个区间。0代表20-29岁区间, 1代表30-39岁,2代表40-49岁,3代表50-59岁,4代表60-69岁,5代表70-79岁。
menopause:绝经期,共三种取值:prememo(未绝经),ge40(40岁之后绝经),lt40(40岁之前绝经)
tumor-size:肿瘤大小,按照大小划分为11个区间。例如:0代表0-4区间,1代表5-9区间,2代表10-14区间,3代表15-19区间,4代表20-24区间,5代表25-29区间,6代表30-34区间,7代表35-39区间,8代表40-44区间,9代表45-49区间,10代表50-54区间。
inv-nodes:淋巴结个数,按照数量划分为9个区间。例如:0代表0-2区间,1代表3-5区间,2代表6-8区间,3代表9-11区间,4代表12-14区间,5代表15-17区间,6代表18-20区间,7代表21-23区间,8代表24-26区间
node-caps:结节冒有无。0表示没有,1表示有。
deg-malig:肿瘤恶性程度,分为1、2、3三种,3恶性程度最高
breast: 病灶的左右位置。0表示分为左胸,1表示右胸。
breast-quad:病灶所在的象限。0表示中间,1表示右上,2表示左上,3表示左下,4表示右下。
irradiat:是否有放射性治疗经历。0表示没有,1表示有。
针对该数据集进行必要的数据探查和预处理,然后训练一个逻辑回归模型,最后计算模型性能。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 装载数据集,打印前5行数据值
df = pd.read_csv('dataset/breast_cancer.csv')
print(df.head())
print("原始数据集维度:", df.shape)
print("=" * 100)
################################################################################
# 任务1:拆分训练集和测试集
################################################################################
print('【任务1开始】', '=' * 100)
# 将原始样本按照7:3的比例拆分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
df.____【1】____[:, 1:], df.iloc[:, 0], test_size=0.3, random_state=100)
print("训练特征集的维度:", X_train.shape)
print("测试特征集的维度:", X_test.shape)
print('【任务1结束】', '=' * 100)
################################################################################
# 任务2:以饼图形式查看训练集和测试集中,每种类别的样本占比
################################################################################
print('【任务2开始】', '=' * 100)
plot_index = 1
for y, title in [(y_train, 'train'), (y_test, 'test')]:
plt.subplot(1, 2, plot_index)
plt.title(title)
y_counts = y.value_counts()
plt.pie(y_counts.values / y_counts.values.____【2】____(),
labels = ['class=0', 'class=1'], # 显示的标签文本
autopct='%.1f%%', # 样本的比例数值保留一位小数
textprops = {'fontsize':14, 'color':'black'} # 文本标签的属性
)
plot_index += 1
plt.show()
print('【任务2结束】', '=' * 100)
################################################################################
# 任务3:对特征进行OneHot数值化处理
################################################################################
print('【任务3开始】', '=' * 100)
# 将menopause字段从文本转换成OneHot编码的0-1数值字段
import sklearn.preprocessing
onehot_encoder = sklearn.preprocessing.____【3】____()
onehot_encoder.fit(X_train[['menopause']]) # 计算OneHot编码映射
menopause_names = onehot_encoder.categories_[0] # 获取OneHot编码的字段名称
# 对训练数据进行OneHot编码,并将编码后的若干个字段保存到训练特征集中
X_train['menopause_' + menopause_names] = onehot_encoder.transform(X_train[['menopause']]).toarray()
# 对测试数据进行OneHot编码,并将编码后的若干个字段保存到测试特征集中
X_test['menopause_' + menopause_names] = onehot_encoder.transform(X_test[['menopause']]).toarray()
# 从训练特征集和测试特征集中删除menopause字段
for X in [X_train, X_test]:
X.____【4】____((['menopause'], axis=1, inplace=True)
print("任务3完成后,训练特征集前5行样本:")
print(X_train.head())
print('【任务3结束】', '=' * 100)
################################################################################
# 任务4:训练逻辑回归模型,并对测试数据进行预测
################################################################################
print('【任务4开始】', '=' * 100)
from sklearn.linear_model import LogisticRegression
# 构建LogisticRegression对象,并设置正则化惩罚系数为0.1
model = LogisticRegression(____【5】____=0.1)
model.fit(X_train, y_train)
# 使用判别式计算结果
decision_results = model.decision_function(X_test)
# 将计算结果转换成为分类结果(0或1)
y_test_predict = (decision_results ____【6】____ 0).astype(np.int32)
print("测试样本的预测结果(前5个):", y_test_predict[:5])
print('【任务4结束】', '=' * 100)
################################################################################
# 任务5:针对测试数据,计算性能指标
################################################################################
print('【任务5开始】', '=' * 100)
from sklearn.metrics import precision_score
precision = precision_score(y_true=____【7】, y_pred=____【8】____) # 计算测试数据的精度(Precision)
accuracy = model.score(____【9】____, ____【10】____) # 计算测试数据的预测正确率(Accuracy)
print("测试数据集的Precision=%.2f" % precision)
print("测试数据集的Accuracy=%.2f" % accuracy)
print('【任务5结束】', '=' * 100)