文章目录
- 项目六:分类分析
- 实践目的
- 实践平台
- 实践内容
- (一)数据理解及准备
- (二)模型建立、预测及优化
- 任务一:使用 KNN算法进行分类预测
- 任务二:使用贝叶斯分类算法进行分类预测
- 任务三:使用支持向量机(SVM)算法进行分类预测
- 任务四:使用逻辑回归算法进行分类预测
- 任务五:使用决策树算法进行分类预测
- 乳腺癌数据分析与诊断代码
- (一)数据理解及准备
- (二)模型建立、预测及优化
- 任务一:使用KNN算法进行分类预测
- 任务二:使用贝叶斯分类算法进行分类预测
- 任务三:使用支持向量机(SVM)算法进行分类预测
- 任务四:使用逻辑回归算法进行分类预测
- 任务五:使用决策树算法进行分类预测
项目六:分类分析
实践目的
- 理解分类分析算法原理;
- 熟悉并掌握常用分类算法的使用方法;
- 熟悉模型性能评估的方法;
- 掌握模型优化的方法。
实践平台
- 操作系统:Windows7及以上
- Python版本:3.8.x及以上
- 开发环境:PyCharm或Anoconda集成环境
实践内容
数据集文件名为“bc_data.csv”,数据内容来自“威斯康星乳腺癌数据库(Wisconsin Breast Cancer Database)”,该数据集主要记录了569个病例的32个属性。主要属性/字段如下:
- ID:病例的 ID;
- Diagnosis(诊断结果):M为恶性,B为良性。该数据集共包含357个良性病例和212个恶性病例;
- 细胞核的10个特征值,包括 radius(半径)、texture(纹理)、perimeter(周长)、面积(area)、平滑度(smoothness)、紧凑度(compactness)、凹面(concavity)、凹点(concave points)、对称性(symmetry)和分形维数(fractal dimension)。同时,为上述10个特征值分别提供了三种统计量,分别为均值(mean)、标准差(standard error)和最大值(worst or largest)。
本项目实践所涉及的业务为乳腺癌数据分析及自动诊断。将从数据库选取的569条数据分为训练集和测试集,通过分类算法模型预测诊断结果,并与实际诊断结果进行对比分析,从而验证模型的有效性。
(一)数据理解及准备
- 导入本案例所需的Python包;
- 通过describe()、info()方法、shape属性等对读入的数据对象进行探索性分析。
- 结合实际数据情况,对数据集进行适当的预处理;
- 提取用于诊断分析的细胞核的特征,并划分训练集和测试集。
(二)模型建立、预测及优化
任务一:使用 KNN算法进行分类预测
- 模型训练
- 通过KNeighborsClassifier()方法进行模型训练;
- 使用get_params()方法查询模型各参数。
- 使用模型进行数据预测;
- 模型评价
- 调用scikit-learn.metrics模块中的accuracy_scorer()方法对模型性能进行评价,并输出预测结果的准确率。
- 模型优化
- 找出在1~22范围内最优k值,并使用最优值对模型进行优化;
- 使用优化后的模型进行数据预测,并再次对模型进行评价;
任务二:使用贝叶斯分类算法进行分类预测
- 模型训练
- 通过GaussianNB()方法建立模型并训练;
- 使用模型进行数据预测;
- 模型评价
- 调用scikit-learn.metrics模块中的accuracy_score(),precision_score(),recall_score(),f1_score()方法对模型的准确率、精确率、召回率、f1值性能进行评价,并输出评价结果。
- 模型优化
- 调用sklearn.model_selection模块中的GridSearchCV()网格搜索函数,搜索GaussianNB模型中var_smoothing参数的最优值,拟将var_smoothing设置在[1e-7, 1e-8, 1e-9, 1e-10, 1e-11, 1e-12]范围中;
- 使用最优值对模型进行优化和预测;
- 再次对模型进行评价,对比评价结果;
任务三:使用支持向量机(SVM)算法进行分类预测
- 模型训练
- 通过svm.SVC()方法建立模型并训练;
- 使用模型进行数据预测;
- 模型评价
- 调用scikit-learn.metrics模块中的confusion_matrix()、accuracy_scorer()、precision_score(),recall_score(),f1_score()方法分别对模型的混淆矩阵、准确率、精确率、召回率、f1值指标进行评价,并输出评价结果;
- 使用support_属性找出各类支持向量在训练样本中的索引;
- 使用support_vectors_属性输出所有的支持向量。
任务四:使用逻辑回归算法进行分类预测
- 模型训练
- 通过LogisticRegression()方法建立模型并训练;
- 使用模型进行数据预测;
- 模型评价
- 调用scikit-learn.metrics模块中的confusion_matrix()、accuracy_scorer()、precision_score(),recall_score(),f1_score()方法分别对模型的混淆矩阵、准确率、精确率、召回率、f1值指标进行评价,并输出评价结果;
- 调用GridSearchCV函数确定模型的最佳参数。设置需要最优化的参数的取值范围(如{‘C’:[0.001,0.01,0.1,1,10,20,50,100],‘penalty’:[‘l1’,“l2”]})和交叉验证的折数(如cv=5);
- 通过best_params_属性返回性能最好的参数组合;
- 使用调参后的模型进行训练,并输出预测结果;
- 输出调参后模型的评价指标:混淆矩阵、准确率、精确率、召回率和f1值。
任务五:使用决策树算法进行分类预测
- 模型训练
- 通过DecisionTreeClassifier()方法建立模型并训练;
- 使用模型进行数据预测,并输出预测结果;
- 模型评价
- 调用scikit-learn.metrics模块中的accuracy_scorer()方法对模型性能进行评价,并输出预测结果的准确率。
- 使用plot_tree()函数生成决策树图,观察决策树中不同特征出现的深度和频率;
乳腺癌数据分析与诊断代码
(一)数据理解及准备
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
# 读取数据
data = pd.read_csv('bc_data.csv')
# 初步数据检查
print(data.head()) # 查看前几行数据
print(data.describe()) # 查看数据统计信息
print(data.info()) # 查看数据类型和缺失信息
# 检查缺失值
print(data.isnull().sum())
from sklearn.impute import SimpleImputer
# 如果有缺失值,用均值填充
imputer = SimpleImputer(strategy='mean')
X = data.drop(['id', 'diagnosis'], axis=1) # 假设 'id' 和 'diagnosis' 列是无关的
X_imputed = imputer.fit_transform(X)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_imputed)
# 提取标签
y = data['diagnosis']
# 数据集分割
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
(二)模型建立、预测及优化
任务一:使用KNN算法进行分类预测
# 模型训练
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
# 创建 KNN 模型,n_neighbors 是最近邻的数量
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train, y_train)
# 对测试集进行预测
y_pred = knn.predict(X_test)
# 计算并输出模型性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')
cm = confusion_matrix(y_test, y_pred)
print(f"混淆矩阵:\n{cm}")
print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")
混淆矩阵:
[[68 3]
[ 3 40]]
准确率: 0.9473684210526315, 精确率: 0.9302325581395349, 召回率: 0.9302325581395349, F1 值: 0.9302325581395349
# 模型优化
best_k = 1
best_accuracy = 0
# 寻找最佳的 k 值
for k in range(1, 23):
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
if accuracy > best_accuracy:
best_k = k
best_accuracy = accuracy
print(f"最佳 k 值: {best_k}, 对应的准确率: {best_accuracy}")
# 使用最佳 k 值重新训练模型
knn_best = KNeighborsClassifier(n_neighbors=best_k)
knn_best.fit(X_train, y_train)
y_pred_best = knn_best.predict(X_test)
# 计算并输出优化后的模型性能指标
accuracy_best = accuracy_score(y_test, y_pred_best)
precision_best = precision_score(y_test, y_pred_best, pos_label='M')
recall_best = recall_score(y_test, y_pred_best, pos_label='M')
f1_best = f1_score(y_test, y_pred_best, pos_label='M')
cm_best = confusion_matrix(y_test, y_pred_best)
print(f"优化后 - 混淆矩阵:\n{cm_best}")
print(f"优化后的准确率: {accuracy_best}, 精确率: {precision_best}, 召回率: {recall_best}, F1 值: {f1_best}")
最佳 k 值: 9, 对应的准确率: 0.9649122807017544
优化后 - 混淆矩阵:
[[69 2]
[ 2 41]]
优化后的准确率: 0.9649122807017544, 精确率: 0.9534883720930233, 召回率: 0.9534883720930233, F1 值: 0.9534883720930233
任务二:使用贝叶斯分类算法进行分类预测
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 创建高斯朴素贝叶斯模型
nb = GaussianNB()
# 训练模型
nb.fit(X_train, y_train)
# 对测试集进行预测
y_pred = nb.predict(X_test)
# 计算并输出模型性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')
print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")
准确率: 0.9649122807017544, 精确率: 0.975609756097561, 召回率: 0.9302325581395349, F1 值: 0.9523809523809523
# 模型优化:from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 定义参数搜索空间
params = {'var_smoothing': [1e-7, 1e-8, 1e-9, 1e-10, 1e-11, 1e-12]}
# 使用 GridSearchCV 进行参数优化
gs = GridSearchCV(GaussianNB(), params, cv=5, scoring='accuracy', verbose=1)
gs.fit(X_train, y_train)
# 输出最佳参数
print(f"最佳参数: {gs.best_params_}")
# 使用最佳模型进行预测
y_pred_optimized = gs.predict(X_test)
# 计算并输出优化后的模型性能指标
accuracy_optimized = accuracy_score(y_test, y_pred_optimized)
precision_optimized = precision_score(y_test, y_pred_optimized, pos_label='M')
recall_optimized = recall_score(y_test, y_pred_optimized, pos_label='M')
f1_optimized = f1_score(y_test, y_pred_optimized, pos_label='M')
print(f"优化后的准确率: {accuracy_optimized}, 精确率: {precision_optimized}, 召回率: {recall_optimized}, F1 值: {f1_optimized}")
最佳参数: {‘var_smoothing’: 1e-07}
优化后的准确率: 0.9649122807017544, 精确率: 0.975609756097561, 召回率: 0.9302325581395349, F1 值: 0.9523809523809523
任务三:使用支持向量机(SVM)算法进行分类预测
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn import svm
# 模型训练
svc = svm.SVC()
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
print(f"混淆矩阵:\n{cm}")
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
# 计算精确率、召回率和 F1 值,指定 pos_label 为 'M'
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')
print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")
# 输出支持向量
support_vectors = svc.support_vectors_
print(f"支持向量: {support_vectors}")
[ 2 41]]
准确率: 0.9736842105263158, 精确率: 0.9761904761904762, 召回率: 0.9534883720930233, F1 值: 0.9647058823529412
任务四:使用逻辑回归算法进行分类预测
# 模型训练
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(max_iter=1000)
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
print(f"混淆矩阵:\n{cm}")
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
# 计算精确率、召回率和 F1 值,指定 pos_label 为 'M'
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')
print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")
混淆矩阵:
[[70 1]
[ 2 41]]
准确率: 0.9736842105263158, 精确率: 0.9761904761904762, 召回率: 0.9534883720930233, F1 值: 0.9647058823529412
# 模型优化
# 定义参数搜索空间
params = {
'C': [0.001, 0.01, 0.1, 1, 10, 20, 50, 100],
'penalty': ['l1', 'l2'],
'solver': ['liblinear'] # 'liblinear' 支持 'l1' 和 'l2' 正则化
}
# 使用 GridSearchCV 进行参数优化
gs = GridSearchCV(LogisticRegression(max_iter=1000), params, cv=5)
gs.fit(X_train, y_train)
# 输出最佳参数
print(f"最佳参数: {gs.best_params_}")
# 使用最佳模型进行预测
y_pred = gs.predict(X_test)
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
# 计算性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')
# 输出结果
print(f"混淆矩阵:\n{cm}")
print(f"优化后的准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")
最佳参数: {‘C’: 0.1, ‘penalty’: ‘l2’, ‘solver’: ‘liblinear’}
混淆矩阵:
[[71 0]
[ 1 42]]
优化后的准确率: 0.9912280701754386, 精确率: 1.0, 召回率: 0.9767441860465116, F1 值: 0.9882352941176471
任务五:使用决策树算法进行分类预测
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
# 构建决策树分类器
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)
# 计算并输出模型准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")
feature_names = data.drop('diagnosis', axis=1).columns
# 绘制决策树
plt.figure(figsize=(20, 10))
plot_tree(
dt,
feature_names=feature_names, # 这里传入你的特征名称
class_names=["M", "B"], # 类标签名称
filled=True
)
plt.show()
准确率: 0.9298245614035088