合肥公司做网站,上海建筑公司名称大全,wordpress投稿功能,一个公司可以做多少个网站简介
在机器学习中#xff0c;分类问题是一种常见的任务#xff0c;目标是根据输入特征将数据点分配到不同的类别中。为了实现分类#xff0c;我们需要训练一个分类器#xff0c;该分类器能够根据输入数据的特征进行预测。
逻辑回归#xff08;Logistic Regression…简介
在机器学习中分类问题是一种常见的任务目标是根据输入特征将数据点分配到不同的类别中。为了实现分类我们需要训练一个分类器该分类器能够根据输入数据的特征进行预测。
逻辑回归Logistic Regression是一种常用的分类算法尤其适用于二分类问题。逻辑回归的核心思想是通过对数几率函数logistic function将线性回归的输出映射到概率空间从而实现分类。
注意逻辑回归虽然名字中有回归二字但是它不是回归算法而是分类算法。
逻辑回归理解
逻辑回归Logistic Regression是一种广泛使用的分类算法它的主要思想是将输入变量的线性组合映射到0到1之间的概率用于预测二元输出变量的概率。
逻辑回归模型的举例
假设我们有一个二元分类问题需要预测一个样本属于两个类别中的哪一个。逻辑回归模型使用一个参数化函数来计算给定输入变量的输出概率。该函数称为 sigmoid 函数它将输入变量的线性组合映射到0到1之间的值表示预测样本属于正例的概率。训练模型的过程就是通过最大化似然函数来估计模型的权重。似然函数是一个关于模型参数的函数表示给定模型下样本的概率。为了最大化似然函数我们可以使用梯度下降算法来更新模型的权重。梯度下降算法通过反复迭代来最小化损失函数直到找到最优解。损失函数通常使用对数损失函数log loss来衡量模型的性能。训练模型后我们可以使用模型来预测新的样本的类别标签。预测类别标签的方法是将新样本的特征向量代入 sigmoid 函数计算输出概率如果概率大于0.5则预测为正例否则预测为负例。 逻辑回归模型简单而直观易于理解和实现常用于二元分类问题的建模
sigmoid 函数
sigmoid 函数的数学形式为其中z 是输入变量的线性组合可以表示为 其中 是模型的权重即系数 是输入变量的值。 sigmoid 函数的数学形式为 它是一个定义域为 (−∞, ∞) 值域为 (0,1) 的严格单调递增函数其图像如下图所示: 其中z 是输入变量的线性组合可以表示为ZbW1X1W2X2…WnXn其中Wi是模型的权重即系数Xi是输入变量的值。
在逻辑回归中我们将输入变量通过线性组合得到 z 值然后将 z 值代入 sigmoid 函数中得到一个介于 0 和 1 之间的概率值表示预测为正类的概率。sigmoid 函数的特性使其能够将任意实数映射到 (0, 1) 区间因此适用于二分类问题的概率预测。
似然函数
似然函数是一个关于模型参数的函数表示给定模型下样本的概率。在逻辑回归中似然函数可以表示为 其中Zi是第i个样本的线性组合Yi是对应的类别标签0或1
极大似然估计
核心思想
设模型中含有待估参数w可以取很多值。已经知道了样本观测值从w的一切可能值中选出一个使该观察值出现的概率为最大的值作为w参数的估计值这就是极大似然估计。顾名思义就是看上去那个是最大可能的意思
举个例子
假设有一枚不均匀的硬币出现正面的概率和反面的概率是不同的。假定出现正面的概率为 抛了6次得到如下现象 D {正面反面反面正面正面正面}。每次投掷事件都是相互独立的。 则根据产生的现象D来估计参数是多少? 对数函数
逻辑回归原理
原理
逻辑回归概念 Logistic Regression
• 一种分类模型把线性回归的输出作为逻辑回归的输入。
• 输出是(0, 1)之间的值
• 基本思想
利用线性模型 f(x) wx b 根据特征的重要性计算出一个值再使用 sigmoid 函数将 f(x) 的输出值映射为概率值 设置阈值(eg:0.5)输出概率值大于 0.5则将未知样本输出为 1 类否则输出为 0 类
3.逻辑回归的假设函数 h(w) sigmoid(wx b )
线性回归的输出作为逻辑回归的输入
在逻辑回归中当预测结果不对的时候我们该怎么衡量其损失呢
我们来看下图(下图中设置阈值为0.6) 那么如何去衡量逻辑回归的预测结果与真实结果的差异
损失函数 逻辑回归API
API介绍
sklearn.linear_model.LogisticRegression(solverliblinear, penalty‘l2’, C 1.0)solver 损失函数优化方法:
训练速度:liblinear 对小数据集场景训练速度更快sag 和 saga 对大数据集更快一些。 2 正则化:
newton-cg、lbfgs、sag、saga 支持 L2 正则化或者没有正则化2liblinear 和 saga 支持 L1 正则化
penalty:正则化的种类l1 或者 l2
C:正则化力度
默认将类别数量少的当做正例
癌症分类案例
数据介绍
1699条样本共11列数据第一列用语检索的id后9列分别是与肿瘤相关的医学特征
最后一列表示肿瘤类型的数值。
2包含16个缺失值用”?”标出。
32表示良性4表示恶性 数据描述 1699条样本共11列数据第一列用语检索的id后9列分别是与肿瘤 相关的医学特征最后一列表示肿瘤类型的数值。 2包含16个缺失值用”?”标出。
案例分析
1.获取数据
2.基本数据处理
2.1 缺失值处理
2.2 确定特征值,目标值
2.3 分割数据
3.特征工程(标准化)
4.机器学习(逻辑回归)
5.模型评估代码实现
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScalerdef dm01_LogisticRegression():# 1. 获取数据.data pd.read_csv(data/breast-cancer-wisconsin.csv)data.info()# 2. 数据预处理.# data data.replace(to_replace?, valuenp.NAN)data data.replace(?, np.NaN)data data.dropna()data.info()# 3. 确定特征值和目标值.x data.iloc[:, 1:-1]y data.Classprint(fx.head(): {x.head()})print(fy.head(): {y.head()})# 3. 分割数据.x_train, x_test, y_train, y_test train_test_split(x, y, test_size0.2, random_state21)# 4. 特征处理.transfer StandardScaler()x_train transfer.fit_transform(x_train)x_test transfer.transform(x_test)# 5. 模型训练.estimator LogisticRegression()estimator.fit(x_train, y_train)# 6. 模型预测y_predict estimator.predict(x_test)print(f预测值: {y_predict})# 7. 模型评估print(f准确率: {estimator.score(x_test, y_test)})print(f准确率: {accuracy_score(y_test, y_predict)})if __name__ __main__:dm01_LogisticRegression()分类评估方法
混淆矩阵 混淆矩阵作用在测试集样本集中
真实值是 正例 的样本中被分类为 正例 的样本数量有多少这部分样本叫做真正例TPTrue Positive真实值是 正例 的样本中被分类为 假例 的样本数量有多少这部分样本叫做伪反例FNFalse Negative真实值是 假例 的样本中被分类为 正例 的样本数量有多少这部分样本叫做伪正例FPFalse Positive真实值是 假例 的样本中被分类为 假例 的样本数量有多少这部分样本叫做真反例TNTrue Negative True Positive 表示样本真实的类别 Positive 表示样本被预测为的类别 例子
样本集中有 6 个恶性肿瘤样本4 个良性肿瘤样本我们假设恶性肿瘤为正例则
模型 A 预测对了 3 个恶性肿瘤样本4 个良性肿瘤样本
真正例 TP 为3伪反例 FN 为3伪正例 FP 为0真反例 TN4
模型 B 预测对了 6 个恶性肿瘤样本1个良性肿瘤样本
真正例 TP 为6伪反例 FN 为0伪正例 FP 为3真反例 TN1
我们会发现TPFNFPTN 总样本数量
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score
import pandas as pddef dm01_混淆矩阵四个指标():# 1. 定义样本集, 6个恶性肿瘤样本, 4个良性肿瘤样本y_true [恶性, 恶性, 恶性, 恶性, 恶性, 恶性, 良性, 良性, 良性, 良性]# 2. 定义标签labels [恶性, 良性]# 3. 模型A 预测对了 3个恶性, 4个良性.y_pred_A [恶性, 恶性, 恶性, 良性, 良性, 良性, 良性, 良性, 良性, 良性]result confusion_matrix(y_true, y_pred_A)print(pd.DataFrame(result, indexlabels, columnslabels))# 4. 模型B 预测对了6个恶性肿瘤样本, 1个良性肿瘤样本.y_pred_B [恶性, 恶性, 恶性, 恶性, 恶性, 恶性, 恶性, 恶性, 恶性, 良性]result confusion_matrix(y_true, y_pred_B)print(pd.DataFrame(result, indexlabels, columnslabels))# 5. 计算精确率 (precision)print(f模型A精确率: {precision_score(y_true, y_pred_A, pos_label恶性)})print(f模型B精确率: {precision_score(y_true, y_pred_B, pos_label恶性)})# 6. 计算召回率 (recall)print(f模型A召回率: {recall_score(y_true, y_pred_A, pos_label恶性)})print(f模型B召回率: {recall_score(y_true, y_pred_B, pos_label恶性)})# 7. 计算F1值print(f模型A F1值: {f1_score(y_true, y_pred_A, pos_label恶性)})print(f模型B F1值: {f1_score(y_true, y_pred_B, pos_label恶性)})if __name__ __main__:dm01_混淆矩阵四个指标()Precision精确率
精确率也叫做查准率指的是对正例样本的预测准确率。比如我们把恶性肿瘤当做正例样本则我们就需要知道模型对恶性肿瘤的预测准确率。 例子
样本集中有 6 个恶性肿瘤样本4 个良性肿瘤样本我们假设恶性肿瘤为正例则
模型 A 预测对了 3 个恶性肿瘤样本4 个良性肿瘤样本
真正例 TP 为3伪反例 FN 为3假正例 FP 为0真反例 TN4精准率3/(30) 100%
模型 B 预测对了 6 个恶性肿瘤样本1个良性肿瘤样本
真正例 TP 为6伪反例 FN 为0假正例 FP 为3真反例 TN1精准率6/(63) 67%
Recall召回率
召回率也叫做查全率指的是预测为真正例样本占所有真实正例样本的比重。例如我们把恶性肿瘤当做正例样本则我们想知道模型是否能把所有的恶性肿瘤患者都预测出来。 例子
样本集中有 6 个恶性肿瘤样本4 个良性肿瘤样本我们假设恶性肿瘤为正例则
模型 A 预测对了 3 个恶性肿瘤样本4 个良性肿瘤样本
真正例 TP 为3伪反例 FN 为3假正例 FP 为0真反例 TN4精准率3/(30) 100%召回率3/(33)50%
模型 B 预测对了 6 个恶性肿瘤样本1个良性肿瘤样本
真正例 TP 为6伪反例 FN 为0假正例 FP 为3真反例 TN1精准率6/(63) 67%召回率6/(60) 100%
F1-score
如果我们对模型的精度、召回率都有要求希望知道模型在这两个评估方向的综合预测能力如何则可以使用 F1-score 指标。 样本集中有 6 个恶性肿瘤样本4 个良性肿瘤样本我们假设恶性肿瘤为正例则
模型 A 预测对了 3 个恶性肿瘤样本4 个良性肿瘤样本
真正例 TP 为3伪反例 FN 为3假正例 FP 为0真反例 TN4精准率3/(30) 100%召回率3/(33)50%F1-score(2*3)/(2*330)67%
模型 B 预测对了 6 个恶性肿瘤样本1个良性肿瘤样本
真正例 TP 为6伪反例 FN 为0假正例 FP 为3真反例 TN1精准率6/(63) 67%召回率6/(60) 100%F1-score(2*6)/(2*603)80%
ROC曲线和AUC指标
ROC 曲线
ROC 曲线我们分别考虑正负样本的情况 正样本中被预测为正样本的概率即TPR True Positive Rate 负样本中被预测为正样本的概率即FPR False Positive Rate ROC 曲线图像中4 个特殊点的含义 (0, 0) 表示所有的正样本都预测为错误所有的负样本都预测正确 (1, 0) 表示所有的正样本都预测错误所有的负样本都预测错误 (1, 1) 表示所有的正样本都预测正确所有的负样本都预测错误 (0, 1) 表示所有的正样本都预测正确所有的负样本都预测正确
绘制 ROC 曲线
假设在网页某个位置有一个广告图片或者文字该广告共被展示了 6 次有 2 次被浏览者点击了。每次点击的概率如下
样本是否被点击预测点击概率110.9200.7310.8400.6500.5600.4
根据预测点击概率排序之后
样本是否被点击预测点击概率110.9310.8200.7400.6500.5600.4
绘制 ROC 曲线
阈值0.9
原本为正例的 1、3 号的样本中 3 号样本被分类错误则 TPR 1/2 0.5原本为负例的 2、4、5、6 号样本没有一个被分为正例则 FPR 0
阈值0.8
原本为正例的 1、3 号样本被分类正确则 TPR 2/2 1原本为负例的 2、4、5、6 号样本没有一个被分为正例则 FPR 0
阈值0.7
原本为正例的 1、3 号样本被分类正确则 TPR 2/2 1原本为负类的 2、4、5、6 号样本中 2 号样本被分类错误则 FPR 1/4 0.25
阈值0.6
原本为正例的 1、3 号样本被分类正确则 TPR 2/2 1原本为负类的 2、4、5、6 号样本中 2、4 号样本被分类错误则 FPR 2/4 0.5
阈值0.5
原本为正例的 1、3 号样本被分类正确则 TPR 2/2 1原本为负类的 2、4、5、6 号样本中 2、4、5 号样本被分类错误则 FPR 3/4 0.75
阈值 0.4
原本为正例的 1、3 号样本被分类正确则 TPR 2/2 1原本为负类的 2、4、5、6 号样本全部被分类错误则 FPR 4/4 1
(0, 0.5)、(0, 1)、(0.25, 1)、(0.5, 1)、(0.75, 1)、(1, 1)
由 TPR 和 FPR 构成的 ROC 图像为
AUC 值
我们发现图像越靠近 (0,1) 点则模型对正负样本的辨别能力就越强我们发现图像越靠近 (0, 1) 点则 ROC 曲线下面的面积就会越大AUC 是 ROC 曲线下面的面积该值越大则模型的辨别能力就越强AUC 范围在 [0, 1] 之间当 AUC 1 时该模型被认为是完美的分类器但是几乎不存在完美分类器 AUC 值主要评估模型对正例样本、负例样本的辨别能力. 分类评估报告api
sklearn.metrics.classification_report(y_true, y_pred, labels[], target_namesNone )y_true真实目标值y_pred估计器预测目标值labels:指定类别对应的数字target_names目标类别名称return每个类别精确率与召回率AUC计算API
from sklearn.metrics import roc_auc_scoresklearn.metrics.roc_auc_score(y_true, y_score)计算ROC曲线面积即AUC值y_true每个样本的真实类别必须为0(反例),1(正例)标记y_score预测得分可以是正例的估计概率、置信值或者分类器方法的返回值【实践】电信客户流失预测
学习目标
1.了解案例的背景信息
2.知道案例的处理流程
3.动手实现电信客户流失案例的代码
数据集介绍
流失用户指的使用过产品因为某些原因不再使用该产品。随着产品的更新迭代都会存在一定的流失情况这时正常现象。流失用户的比例和变化趋势能够反映该产品当前是否存在问题以及未来的发展趋势。当用户群体庞大时有限的人力和精力不能为每个用户都投入大量的时间。如果公司可以预测哪些用户可能提前流失这样就能将主要精力聚焦于这些用户实施有效的用户挽留策略提高用户粘性。本项目旨在通过分析特征属性确定用户流失的原因以及哪些因素可能导致用户流失。建立预测模型来判断用户是否流失并提出用户流失预警策略。具体数据说明如下数据集中总计7043条数据21个特征字段最终分类特征为Churn用户是否流失具体内容如下所示 customerID用户ID gender性别 SeniorCitizen是否是老人 Partner是否有伴侣 Dependents是否有需要抚养的孩子 tenure任职 PhoneService是否办理电话服务 MultipleLines是否开通了多条线路 InternetService是否开通网络服务和开通的服务类型光纤、电话拨号 TechSupport是否办理技术支持服务 OnlineBackup是否办理在线备份服务 OnlineSecurity是否办理在线安全服务 DeviceProtection是否办理设备保护服务 StreamingTV是否办理电视服务 StreamingMovies是否办理电影服务 Contract签订合约的时长 PaperlessBilling是否申请了无纸化账单 PaymentMethod付款方式电子支票、邮寄支票、银行自动转账、信用卡自动转账 MonthlyCharges月消费 TotalCharges总消费 Churn用户是否流失
处理流程
1、数据基本处理
查看数据的基本信息 对类别数据数据进行one-hot处理
查看标签分布情况
2、特征筛选
分析哪些特征对标签值影响大
初步筛选出对标签影响比较大的特征形成x、y
3、模型训练
模型训练
交叉验证网格搜索等
4、模型评估
精确率
Roc_AUC指标计算
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score# 1. 定义函数, 表示: 数据基本处理
def dm01_数据基本处理():# 1. 读取数据, 查看数据的基本信息.churn_pd pd.read_csv(data/churn.csv)# churn_pd.info()# print(fchurn_pd.describe(): {churn_pd.describe()})# print(fchurn_pd: {churn_pd})# 2. 处理类别型的数据, 类别型数据做 one-hot编码(热编码).churn_pd pd.get_dummies(churn_pd)churn_pd.info()# print(fchurn_pd: {churn_pd})# 3. 去除列 Churn_No, gender_Malechurn_pd.drop([Churn_No, gender_Male], axis1, inplaceTrue) # 按列删除print(fchurn_pd: {churn_pd})# 4. 列标签重命名, 打印列名churn_pd.rename(columns{Churn_Yes: flag}, inplaceTrue)print(f列名: {churn_pd.columns})# 5. 查看标签的分布情况 0.26用户流失value_counts churn_pd.flag.value_counts()print(value_counts)# 2. 定义函数, 表示: 特征筛选
def dm02_特征筛选():# 1. 读取数据churn_pd pd.read_csv(data/churn.csv)# 2. 处理类别型的数据, 类别型数据做 one-hot编码(热编码).churn_pd pd.get_dummies(churn_pd)# 3. 去除列 Churn_No, gender_Malechurn_pd.drop([Churn_No, gender_Male], axis1, inplaceTrue)# 4. 列标签重命名churn_pd.rename(columns{Churn_Yes: flag}, inplaceTrue)# 5. 查看标签的分布情况value_counts churn_pd.flag.value_counts()print(value_counts)# 6. 查看Contract_Month 是否预签约流失情况sns.countplot(datachurn_pd, xContract_Month, hueflag)plt.show()# 3. 定义函数, 表示: 模型训练 和 评测
def dm03_模型训练和评测():# 1. 读取数据churn_pd pd.read_csv(data/churn.csv)# 2. 数据预处理# 2.1 处理类别型的数据, 类别型数据做 one-hot编码(热编码).churn_pd pd.get_dummies(churn_pd)# 2.2 去除列 Churn_No, gender_Malechurn_pd.drop([Churn_No, gender_Male], axis1, inplaceTrue)# 2.3 列标签重命名churn_pd.rename(columns{Churn_Yes: flag}, inplaceTrue)# 3. 特征处理.# 3.1 提取特征和标签x churn_pd[[Contract_Month, internet_other, PaymentElectronic]]y churn_pd[flag]# 3.2 训练集和测试集的分割x_train, x_test, y_train, y_test train_test_split(x, y, test_size0.3, random_state21)# 4. 模型训练.estimator LogisticRegression()estimator.fit(x_train, y_train)# 5. 模型预测y_predict estimator.predict(x_test)print(f预测结果: {y_predict})# 6. 模型评估print(f准确率: {accuracy_score(y_test, y_predict)})print(f准确率: {estimator.score(x_test, y_test)})# 计算值.print(fAUC值: {roc_auc_score(y_test, y_predict)})if __name__ __main__:# dm01_数据基本处理()# dm02_特征筛选()dm03_模型训练和评测()
坚持分享 共同进步