1 目标
根据历史女性乳腺癌患者数据集(医学指标)构建逻辑回归分类模型进行良/恶性乳腺癌肿瘤预测
2 数据集
- 2.1 数据集来源
数据集源于威斯康星州临床科学中心。每个记录代表一个乳腺癌的随访数据样本。这些是DR Wolberg自1984~1995随访搜集连续乳腺癌患者数据,数据仅包括那些具有侵入性的病例乳腺癌并没有远处转移的医学指标数据集。
2.2 特征值(医学特征)
3 算法
- 3.1 应用场景
经典的二分类算法
广告点击率
判断用户的性别
预测用户是否会购买给定的商品类
判断一条评论是正面的还是负面的 3.2 算法流程
激活函数:映射到概率的函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
预测函数:返回预测结果值
def model(X, theta):
return sigmoid(np.dot(X, theta.T))
def cost(X, y, theta):
left = np.multiply(-y, np.log(model(X, theta)))
right = np.multiply(1 - y, np.log(1 - model(X, theta)))
return np.sum(left - right) / (len(X))
def gradient(X, y, theta):
grad = np.zeros(theta.shape)
error = (model(X, theta)- y).ravel()
for j in range(len(theta.ravel())): #for each parmeter
term = np.multiply(error, X[:,j])
grad[0, j] = np.sum(term) / len(X)
return grad
梯度下降 - 模型迭代学习
寻找山谷的最低点,也就是我们的目标函数终点(什么样的参数能使得目标函数达到极值点)
下山分几步走呢?(更新参数)
(1):找到当前最合适的方向
(2):走那么一小步,走快了该”跌倒 ”了
(3):按照方向与步伐去更新我们的参数
4 应用
4.1 核心算法
column = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses ', 'Class'] # 读取数据 data = pd.read_csv( "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column) # 缺失值处理:包含16个缺失值,用”?”标出 data = data.replace(to_replace='?', value=np.nan) data = data.dropna() # 数据集分割 x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25) # 标准化处理:线性回归模型,w1、w2...wn系数需要标准化 std = StandardScaler() x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 逻辑回归算法 ''' the whole flow, exclude mean cost: 1 Sigmoid function 2 model function 3 gradient function 4 gradient descent @:param C 梯度下降学习率 ''' lg = LogisticRegression() param = {"C": [0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5]} ''' gridsearch:sk-learn封装api带有网格搜索+交叉验证功能,搜索最优梯度下降学习率超参数 @:param cv交叉验证折数 ''' gc = GridSearchCV(lg, param_grid=param, cv=10) gc.fit(x_train, y_train) # 网格搜索最优模型 model = gc.best_estimator_ # 预测测试集 y_predict = model.predict(x_test) print("模型预测结果:", y_predict)
4.2 模型评估
''' 模型评估 分类问题关键点:精确率、准确率、召回率 恶性分类问题:现实2问题,召回率(漏查率)非常关注,混淆矩阵可视化预测结果与真实结果对比 ''' print("准确率:", model.score(x_test, y_test)) print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=['良性', '恶性'])) # 预测结果生成混淆矩阵,confusion matrix @also see liner regression model manual generate function target_names = ['begin', 'malignant'] mat = confusion_matrix(y_test, y_predict) plt.title("predict-to-true confusion matrix") sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False, xticklabels=target_names, yticklabels=target_names) plt.xlabel('true label') plt.ylabel('predicted label') plt.show()
4.3 模型分析报告
报告: precision recall f1-score support
良性 0.97 0.97 0.97 109 恶性 0.95 0.95 0.95 62
avg / total 0.96 0.96 0.96 171
混淆矩阵:
4.4 算法总结
逻辑回归处理样本分布不均匀-异常场景:
样本分布不均衡将导致样本量少的分类所包含的特征过少,并很难从中提取规律;即使得到分类模型,也容易产生过度依赖于有限的数据样本而导致过拟合的问题,当模型应用到新的数据上时,模型的准确性和鲁棒性将很差。
样本分布不平衡主要在于不同类别间的样本比例差异,以笔者的工作经验看,如果不同分类间的样本量差异达到超过10倍就需要引起警觉并考虑处理该问题,超过20倍就要一定要解决该问题。
样本分布均匀的应用场景:
**异常检测场景。*大多数企业中的异常个案都是少量的,比如恶意刷单、黄牛订单、信用卡欺诈、电力窃电、设备故障等,这些数据样本所占的比例通常是整体样本中很少的一部分,以信用卡欺诈为例,刷实体信用卡的欺诈比例一般都在0.1%以内。
客户流失场景。大型企业的流失客户相对于整体客户通常是少量的,尤其对于具有垄断地位的行业巨擘,例如电信、石油、网络运营商等更是如此。
罕见事件的分析。罕见事件与异常检测类似,都属于发生个案较少;但不同点在于异常检测通常都有是预先定义好的规则和逻辑,并且大多数异常事件都对会企业运营造成负面影响,因此针对异常事件的检测和预防非常重要;但罕见事件则无法预判,并且也没有明显的积极和消极影响倾向。例如由于某网络大V无意中转发了企业的一条趣味广告导致用户流量明显提升便属于此类。
发生频率低的事件。这种事件是预期或计划性事件,但是发生频率非常低。例如每年1次的双11盛会一般都会产生较高的销售额,但放到全年来看这一天的销售额占比很可能只有1%不到,尤其对于很少参与活动的公司而言,这种情况更加明显。这种属于典型的低频事件。*
处理策略(详细请参阅作者的信用欺诈实例):
过抽样策略,如SMOTE算法
欠抽样策略