这是我大三的机器学习的期末大作业,怎么会想做癌症预测,是因为偶然间刷到一条关于癌症的新闻,所以就想着做一个基于癌症预测的项目。数据集来源是通过Kaggle下载的Cancer Prediction Dataset下载而来的。
先简单介绍一下随机森林模型
随机森林是一种集成学习方法,它通过构建多个决策树并将它们的结果进行投票或平均,以得到最终的预测。这种方法的主要优点是,通过集成多个模型,它可以有效地处理过拟合问题,提高模型的泛化能力。
接着看一下代码的实现
先导入需要的库
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
接着读取数据集里面的数据,并查看其基本信息查看数据的基本信息
df = pd.read_csv('The_Cancer_data_1500_V2.csv')
print(df.info())
print(df.describe())
接着对数据进行预处理,先对缺失值进行处理,我使用的是用均值填充数值型数据的缺失值,用众数填充分类数据的缺失值
for column in df.columns:
if df[column].dtype == 'object':
df[column].fillna(df[column].mode()[0], inplace=True)
else:
df[column].fillna(df[column].mean(), inplace=True)
然后再检查异常值。使用Z-score方法来识别异常值 (Z-score方法介绍:Z-得分是一种用于比较和分析数据值在数据集的分布中的位置的统计方法。它表示一个数据值与平均值的距离,并以标准差的单位来衡量。)
def detect_outliers_zscore(data, threshold=3):
mean = np.mean(data)
std = np.std(data)
z_scores = [(y - mean) / std for y in data]
return np.where(np.abs(z_scores) > threshold)
接着对数据进行可视化
# 数据可视化
plt.figure(figsize=(12, 8))
# 年龄分布
plt.subplot(2, 2, 1)
sns.distplot(data['Age'], kde=True, bins=30)
plt.title('Age Distribution')
# BMI 分布
plt.subplot(2, 2, 2)
sns.distplot(data['BMI'], kde=True, bins=30)
plt.title('BMI Distribution')
# 体力活动分布
plt.subplot(2, 2, 3)
sns.distplot(data['PhysicalActivity'], kde=True, bins=30)
plt.title('Physical Activity Distribution')
# 酒精摄入分布
plt.subplot(2, 2, 4)
sns.distplot(data['AlcoholIntake'], kde=True, bins=30)
plt.title('Alcohol Intake Distribution')
plt.tight_layout()
plt.show()
接着再查看这些列别与患癌是否又关系,可视化两两之前的关系
# 类别变量分布
plt.figure(figsize=(12, 6))
# 性别分布
plt.subplot(2, 3, 1)
sns.countplot(x='Gender', data=data)
plt.title('Gender Distribution')
# 吸烟情况分布
plt.subplot(2, 3, 2)
sns.countplot(x='Smoking', data=data)
plt.title('Smoking Distribution')
# 遗传风险分布
plt.subplot(2, 3, 3)
sns.countplot(x='GeneticRisk', data=data)
plt.title('Genetic Risk Distribution')
# 癌症病史分布
plt.subplot(2, 3, 4)
sns.countplot(x='CancerHistory', data=data)
plt.title('Cancer History Distribution')
# 诊断分布
plt.subplot(2, 3, 5)
sns.countplot(x='Diagnosis', data=data)
plt.title('Diagnosis Distribution')
plt.tight_layout()
plt.show()
在查看变量间关系
# 变量间关系
plt.figure(figsize=(12, 8))
# BMI 与诊断的关系
plt.subplot(2, 2, 1)
sns.boxplot(x='Diagnosis', y='BMI', data=data)
plt.title('BMI vs Diagnosis')
# 年龄与诊断的关系
plt.subplot(2, 2, 2)
sns.boxplot(x='Diagnosis', y='Age', data=data)
plt.title('Age vs Diagnosis')
# 体力活动与诊断的关系
plt.subplot(2, 2, 3)
sns.boxplot(x='Diagnosis', y='PhysicalActivity', data=data)
plt.title('Physical Activity vs Diagnosis')
# 酒精摄入与诊断的关系
plt.subplot(2, 2, 4)
sns.boxplot(x='Diagnosis', y='AlcoholIntake', data=data)
plt.title('Alcohol Intake vs Diagnosis')
plt.tight_layout()
plt.show()
模型的建立
X = df.drop('Diagnosis', axis=1)
y = df['Diagnosis']
划分训练集,将数据集30%作为测试集
初始化随机森林分类器和使用网格优化搜索
查看最佳参数和最佳模型和模型评估报告
最后可以输入任何的参数进行预测是否患癌症
比如我输入72, 0, 30.82878439, 0, 1, 9.361630416, 3.519683335, 0]
结果输出0,就表示不会患癌症
如果有需要数据集和源代码的,请后台私信我