目录
一、数据及分析对象
CSV文件——“bc_data.csv”
数据集链接:https://download.csdn.net/download/m0_70452407/88524905
该数据集主要记录了569个病例的32个属性,主要属性/字段如下:
(1)ID:病例的ID。
(2)Diagnosis(诊断结果):M为恶性,B为良性。该数据集共包含357个良性病例和212个恶性病例。
(3)细胞核的10个特征值,包括radius(半径)、texture(纹理)、perimeter(周长)、面积(area)、平滑度(smoothness)、紧凑度(compactness)、凹面(concavity)、凹点(concave points)、对称性(symmetry)和分形维数(fractal dimension)等。同时,为上述10个特征值分别提供了3种统计量,分别为均值(mean)、标准差(standard error)和最大值(worst or largest)。
二、目的及分析任务
理解机器学习方法在数据分析中的应用——采用逻辑回归方法进行分类分析。
(1)数据读入。
(2)划分训练集和数据集,利用逻辑回归算法进行模型训练,分类分析。
(3)进行模型评价,调整模型参数。
(4)将调参后的模型进行模型预测,得出的结果与测试集结果进行对比分析,验证逻辑回归算法建模的有效性。
三、方法及工具
Python语言及scikit-learn包。
四、数据读入
导入所需的工具包:
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
导入scikit-learn自带的数据集——威斯康星州乳腺癌数据集,这里采用的实现方式为调用sklearn.datasets中的load_breast_cancer()方法。
#数据读入
from sklearn.datasets import load_breast_cancer
breast_cancer=load_breast_cancer()
导入的威斯康星州乳腺癌数据集是字典数据,显示其字典的键为:
#显示数据集字典的键
print(breast_cancer.keys())
输出结果中,'target'为分类目标,'DESCR'为数据集的完整性描述,'feature_names'为特征名称。
显示数据集的完整描述:
print(breast_cancer.DESCR)
显示数据集的特征名称:
#数据集的特征名称
print(breast_cancer.feature_names)
显示数据形状:
#数据形状
print(breast_cancer.data.shape)
调用pandas包数据框(DataFrame),将数据(data)与回归目标(target)转化为数据框类型。
#将数据(data)与回归目标(target)转换为数据框类型
X=pd.DataFrame(breast_cancer.data,columns=breast_cancer.feature_names)
y=pd.DataFrame(breast_cancer.target,columns=['class'])
将X,y数据框合并后,生成数据集df
#合并数据框
df=pd.concat([X,y],axis=1)
df
五、数据理解
查看数据基本信息:
#查看数据基本信息
df.info()
查看描述性统计信息:
#查看描述新统计信息
df.describe()
六、数据准备
利用sklearn.model_selection的train_test_split()方法划分训练集和测试集,固定random_state为42,用30%的数据测试,70%的数据训练。
#划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,
test_size=0.3,random_state=42)
X_test
七、模型训练
调用默认参数的LogisticRegression在训练集上进行模型训练。
#模型训练
model=LogisticRegression(C=1.0,
class_weight=None,
dual=False,
fit_intercept=True,
intercept_scaling=1,
max_iter=100,
multi_class='ovr',
n_jobs=1,
penalty='l2',
random_state=None,
solver='liblinear',
tol=0.0001,
verbose=0,
warm_start=False)
model.fit(X_train,y_train)
该输出结果显示了模型的训练结果。选择逻辑回归模型参数的默认值进行训练。选择L2正则项,C=1.0控制正则化的强度。"fit_intercept=True,intercept_scaling=1"表示增加截距缩放,减少正则化对综合特征权重的影响。"class_weight=None"表示所有类都有权重。"solver=liblinear"时(在最优化问题时使用"liblinear"算法)。max_iter=100表示求解器收敛所采用的最大迭代次数为100。multi_class="ovr"表示每个标签都适合一个二进制问题。n_jobs表示在类上并行时使用的CPU核心数量。当warm_start设置为True时,重用前一个调用的解决方案以适应初始化,否则,只需删除前一个解决方案。
显示预测结果:
#默认参数模型预测结果y_pred
y_pred=model.predict(X_test)
y_pred
八、模型评价
利用混淆矩阵分类算法的指标进行模型的分类效果评价。
#混淆矩阵(分类算法的重要评估指标)
matrix=metrics.confusion_matrix(y_test,y_pred)
matrix
利用准确度(Accuracy)、精度(Precision)这两项分类指标进行模型的分类效果评价。
#分类评价指标——准确度(Accuracy)
print("Accuracy:",metrics.accuracy_score(y_test,y_pred))
#分类评价指标——精度(Precision)
print("Precision:",metrics.precision_score(y_test,y_pred))
九、模型调参
设置GridSearchCV函数的param_grid、cv参数值。为了防止过拟合现象的出现,通过参数C控制正则化程度,C值越大,正则化越弱。一般情况下,C增大(正则化程度弱),模型的准确性在训练集和测试集上都在提升(对损失函数的惩罚减弱),特征维度更多,学习能力更强,过拟合的风险也更高。L1和L2两项正则化项对目标函数的影响不同,选择的求解模型惨啊书的梯度下降法也不同。
#以C、penalty参数和值设置字典列表param_grid。
#设置cv参数值为5
param_grid={'C':[0.001,0.01,0.1,1,10,20,50,100],
'penalty':["l1","l2"]}
n_folds=5
调用GridSearchCV函数,进行5折交叉验证,得出模型最优参数:
#调用GridSearchCV函数,进行5折交叉验证,对估计器LogisticRegression()的指定参数值param_grid进行详尽搜索,得到最终的最优模型参数
from sklearn.model_selection import GridSearchCV
estimator=GridSearchCV(LogisticRegression(solver='liblinear'),param_grid,cv=n_folds)
estimator.fit(X_train,y_train)
该输出结果显示了调用GridSearchCV()方法对估计器的指定参数值进行详尽搜索。
利用best_estimator_属性,得到通过搜索选择的最高分(或最小损失的估计量):
estimator.best_estimator_
该输出结果显示了最优的模型参数为C=50,penalty="l1"
十、模型预测
调参后的模型训练:
#调参后的模型训练
model1=LogisticRegression(C=50,
class_weight=None,
dual=False,
fit_intercept=True,
intercept_scaling=1,
max_iter=100,
multi_class='ovr',
n_jobs=1,
penalty='l1',
random_state=None,
solver='liblinear',
tol=0.0001,
verbose=0,
warm_start=False)
model1.fit(X_train,y_train)
调参后的模型预测:
#调参后的模型预测
y_pred1=model1.predict(X_test)
y_pred1
调参后的模型混淆矩阵结果:
#调参后的模型混淆矩阵结果
matrix1=metrics.confusion_matrix(y_test,y_pred1)
matrix1
调参后的模型准确度、精度分类指标评价结果:
#调参后的额模型准确度、精度分类指标评价结果
print("Accuracy1:",metrics.accuracy_score(y_test,y_pred1))
print("Precision1:",metrics.precision_score(y_test,y_pred1))
该输出结果显示了调参后的模型分类指标准确度(Accuracy)、精度(Precision)分类指标值。通过与之前未调参的模型分类效果进行对比,可以发现准确度(Accuracy)、精度(Precision)值提升,混淆矩阵得出的结果也更好,分类效果显著提升。