Weighted Logistic Regression和Youtube时长预估

前段时间阅读了youtube的经典论文《Deep Neural Networks for YouTube Recommendations》,其通过weighted LR来实现时长预估,在其原文中对实现的描述非常短,大概意思是在损失函数中,对正例(点击)的交叉熵项,添加观看时长T_i作为权重,会使得LR预估的odds=\theta X能代表观看时长,即e^{\theta X}可以表示对观看时长的预估,这篇论文很多博文都分析烂大街了,但对于weighted LR来实现时长预估的原理,很多博主分析都很有问题,或者分析似是而非,本文将会从最本质来说明其实现思想。

The model is trained with logistic regression under crossentropy loss . However, the positive (clicked) impressions are weighted by the observed watch time on the video. Negative (unclicked) impressions all receive unit weight. In this way, the odds learned by the logistic regression are  \sum{T_i}/(N-k), where N is the number of training examples, k is the number of positive impressions, and T_i is the watch time of the ith impression. Assuming the fraction of positive impressions is small (which is true in our case), the learned odds are approximately

<think> 我们正在讨论使用LogisticRegression进行十折交叉验证。根据引用内容,我们知道: - 交叉验证可以使用KFold或StratifiedKFold(针对分类问题,特别是类别不平衡的数据)[^1][^2] - 在sklearn中,我们可以使用cross_val_score函数来执行交叉验证,并指定评估指标[^3] 步骤: 1. 导入必要的模块:LogisticRegression, KFold或StratifiedKFold, cross_val_score 2. 准备数据(这里以鸢尾花数据集为例) 3. 创建交叉验证对象:对于分类问题,特别是当数据不平衡时,推荐使用StratifiedKFold(如引用[1]所述),它确保每一折的类别分布与整体数据集相同。如果数据平衡,也可以使用KFold。 4. 初始化LogisticRegression模型 5. 使用cross_val_score进行交叉验证,指定模型、数据、交叉验证对象评估指标(如准确度accuracy) 注意:引用[2]提到,当使用shuffle=True时,应设置random_state以保证可重复性。另外,引用[3]提到LogisticRegressionCV可以自动进行交叉验证选择正则化参数C,但这里我们讨论的是使用十折交叉验证评估模型性能(不是调参),所以使用LogisticRegression配合cross_val_score。 但是,如果我们的目的是同时进行参数调优(如选择C)模型评估,则可以考虑LogisticRegressionCV。不过用户当前的问题明确要求十折交叉验证,我们先展示使用cross_val_score的方法。 示例代码(使用StratifiedKFold): ```python from sklearn.linear_model import LogisticRegression from sklearn.model_selection import StratifiedKFold, cross_val_score from sklearn.datasets import load_iris # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 创建分层十折交叉验证对象(确保每一折的类别分布与整体一致) # 注意:设置shuffle=Truerandom_state保证可重复性(引用[2]) stratified_kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) # 初始化逻辑回归模型(可以设置参数,如正则化强度C) model = LogisticRegression(max_iter=200, random_state=42) # 执行交叉验证,使用准确率作为评估指标 scores = cross_val_score(model, X, y, cv=stratified_kfold, scoring='accuracy') # 输出结果 print("各折准确率:") for i, score in enumerate(scores): print(f"折{i+1}: {score:.4f}") print(f"\n平均准确率: {scores.mean():.4f}") print(f"标准差: {scores.std():.4f}") ``` 说明: 1. 这里使用`StratifiedKFold`是因为鸢尾花数据集虽然是平衡的,但作为分类问题,使用分层抽样更合理[^1]。 2. 逻辑回归模型设置`max_iter=200`确保收敛(根据数据集可能需要调整),`random_state`用于模型内部的随机性(如果有的话)。 3. 评估指标为准确率('accuracy'),但可以根据问题需求改为其他指标(如F1-score等)。 另外,如果用户希望自动选择正则化参数C,可以使用`LogisticRegressionCV`,它内部使用交叉验证来选择最佳C。但注意,`LogisticRegressionCV`本身已经包含了交叉验证过程(用于调参),然后返回用最佳参数训练的模型。如果我们想评估这个模型,可以再使用一次交叉验证(嵌套交叉验证)来评估性能,但这样计算开销大。通常,我们使用一次交叉验证(调参与评估分离)即可。 如果用户想用十折交叉验证来调参(选择C),然后再评估,可以使用`LogisticRegressionCV`并设置`cv=10`,然后使用该模型在测试集上评估(但注意这样不是交叉验证评估整个模型的泛化性能,而是调参后评估)。为了得到无偏的泛化性能估计,应该使用嵌套交叉验证,但这里用户只要求十折交叉验证,所以我们先提供上面的示例。 下面我们再给出使用`LogisticRegressionCV`进行参数选择的示例(注意这不是交叉验证评估模型,而是调参): ```python from sklearn.linear_model import LogisticRegressionCV # 使用LogisticRegressionCV自动选择正则化参数C(内部使用5折交叉验证,默认5折) # 我们可以设置cv为我们的十折分层对象 model_cv = LogisticRegressionCV( Cs=10, # 尝试10个不同的C值(默认是10个,在log scale上) cv=stratified_kfold, # 使用我们之前定义的十折分层交叉验证 max_iter=200, random_state=42, scoring='accuracy' ) model_cv.fit(X, y) # 输出最佳C值 print("最佳C值:", model_cv.C_) # 注意:此时model_cv已经用整个数据集训练(使用最佳C),我们可以用它预测 # 但如果我们想评估这个模型(在未见过的数据上),我们还需要一个独立的测试集或者进行嵌套交叉验证 ``` 总结: - 如果只是评估一个固定参数的逻辑回归模型,使用第一个示例(cross_val_score)。 - 如果同时要选择参数C,可以使用LogisticRegressionCV,但要注意评估方式(可能需要额外的测试集或嵌套交叉验证)。 根据用户问题,主要要求是十折交叉验证的评估,所以第一个示例更符合。 最后,生成相关问题。 </think>使用 `LogisticRegression` 进行十折交叉验证的完整指南如下,包含实现方法与代码示例: ### 📊 实现步骤 1. **导入模块** ```python from sklearn.linear_model import LogisticRegression from sklearn.model_selection import StratifiedKFold, cross_val_score from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score ``` 2. **创建分层十折交叉验证对象** ```python stratified_kfold = StratifiedKFold( n_splits=10, # 10折 shuffle=True, # 打乱数据顺序 random_state=42 # 随机种子 ) ``` **为何使用分层抽样?** 在分类问题中,`StratifiedKFold` 确保每折的类别分布与原始数据集一致,尤其适合不平衡数据集[^1]。 3. **初始化逻辑回归模型** ```python model = LogisticRegression( penalty='l2', # L2正则化(默认) C=1.0, # 正则化强度 max_iter=1000, # 最大迭代次数 random_state=42 ) ``` 4. **执行交叉验证** ```python scores = cross_val_score( estimator=model, X=X, y=y, cv=stratified_kfold, # 使用分层十折 scoring='accuracy', # 评估指标 n_jobs=-1 # 使用所有CPU核心加速 ) ``` ### 📝 完整代码示例(鸢尾花数据集) ```python from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import StratifiedKFold, cross_val_score # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 创建分层十折交叉验证 stratified_kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) # 初始化逻辑回归模型(增加max_iter避免收敛警告) model = LogisticRegression(max_iter=1000, random_state=42) # 执行交叉验证 scores = cross_val_score(model, X, y, cv=stratified_kfold, scoring='accuracy') # 输出结果 print("各折准确率:") for fold_idx, score in enumerate(scores): print(f"折{fold_idx+1}: {score:.4f}") print(f"\n平均准确率: {scores.mean():.4f} ± {scores.std():.4f}") ``` ### ⚙️ 关键参数说明 | 参数 | 说明 | 推荐值 | |------|------|--------| | `penalty` | 正则化类型 | `'l2'`(默认) 或 `'l1'` | | `C` | 正则化强度 | 小值增强正则化 (默认1.0) | | `max_iter` | 最大迭代次数 | ≥1000 (避免未收敛警告) | | `scoring` | 评估指标 | `'accuracy'`, `'f1'`, `'roc_auc'`等 | ### 💡 高级用法 1. **自动调参版** 使用 `LogisticRegressionCV` 自动选择最佳正则化参数 $C$: ```python from sklearn.linear_model import LogisticRegressionCV # 自动通过交叉验证选择最佳C值 model_cv = LogisticRegressionCV( Cs=[0.1, 1, 10], # 候选C值 cv=stratified_kfold, # 使用十折 max_iter=1000 ) model_cv.fit(X, y) print(f"最佳C值: {model_cv.C_[0]}") ``` 2. **自定义评估指标** ```python from sklearn.metrics import make_scorer, f1_score # 创建F1分数评估器 f1_scorer = make_scorer(f1_score, average='weighted') scores = cross_val_score(model, X, y, cv=stratified_kfold, scoring=f1_scorer) ``` ### ⚠️ 注意事项 1. **收敛问题**:增加 `max_iter` 参数避免 `ConvergenceWarning` 2. **类别不平衡**:使用 `class_weight='balanced'` 参数调整权重 ```python model = LogisticRegression(class_weight='balanced', max_iter=1000) ``` 3. **随机性控制**:设置 `random_state` 保证结果可复现[^2] 4. **特征缩放**:逻辑回归对特征尺度敏感,建议提前标准化数据 ### 📈 性能优化建议 - 使用 `n_jobs=-1` 启用并行计算加速交叉验证 - 对于大型数据集,减少 `n_splits` (如5折) 提升效率 - 通过 `tol` 参数调整收敛阈值控制训练时间 > 输出示例: > 折1: 0.9333 > 折2: 1.0000 > ... > 平均准确率: 0.9800 ± 0.0327 该方法通过分层抽样保证每折样本分布一致[^1],结合交叉验证提供稳健的模型评估结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值