讲师中心 微信公众号
AI工具推荐 视频效率加速

Scikit-learn逻辑回归:正确合并预测概率到原始数据帧

老浩姑娘_8894

老浩姑娘_8894

发布时间:2025-10-13 09:26:01

|

1006人浏览过

|

来源于php中文网

原创

Scikit-learn逻辑回归:正确合并预测概率到原始数据帧

本文旨在解决scikit-learn逻辑回归预测概率与原始数据帧索引不对齐的问题。通过详细阐述`predict_proba`输出的特性及pandas索引管理的重要性,我们将介绍如何确保预测结果与原始数据行正确关联,避免数据混淆,并提供一个健壮的解决方案,确保预测概率准确地附加到其对应的原始数据行上。

理解Scikit-learn预测与Pandas索引管理

在使用Scikit-learn进行机器学习任务时,我们通常会利用Pandas DataFrame来组织和管理数据。然而,当模型生成预测结果(例如,逻辑回归的概率输出)时,这些结果通常是NumPy数组,它们不包含原始DataFrame的索引信息。如果处理不当,将这些预测结果重新合并到原始DataFrame时,很容易导致索引错位,从而使预测值与不正确的数据行关联。

原始问题中,用户观察到逻辑回归的预测概率分布在正负响应类别中几乎相同,这强烈暗示预测值可能没有正确地与其对应的原始数据行对齐。尤其是在使用pd.merge(..., left_index=True, right_index=True)时,如果待合并的两个DataFrame的索引不一致(例如,一个拥有自定义索引,另一个是默认的RangeIndex),即使指定按索引合并,也可能无法得到预期结果。

predict_proba的输出特性

LogisticRegression.predict_proba()方法返回一个NumPy数组,其形状为(n_samples, n_classes)。对于二分类问题,它通常是(n_samples, 2),其中第一列是类别0的概率,第二列是类别1的概率。这个NumPy数组本身不携带任何关于原始数据行的索引信息。

当我们将这个NumPy数组直接转换为Pandas DataFrame时,例如pd.DataFrame(y_pred, columns=['Prob_0', 'Prob_1']),Pandas会默认创建一个新的RangeIndex(从0开始的整数索引)。如果原始的ret_df具有非默认索引,或者在处理过程中其索引被重置或重新排序,那么这个新的RangeIndex将与ret_df的索引不匹配,从而导致后续合并操作的失败或错误对齐。

解决方案:确保索引对齐

解决此问题的核心在于,在将预测概率转换为DataFrame时,显式地为其指定与用于预测的特征数据相同的索引。这样可以保证预测结果DataFrame的索引与原始特征DataFrame的索引完全一致,从而为后续的合并操作奠定正确的基础。

以下是修正后的代码示例,它演示了如何确保预测概率与原始数据帧正确对齐:

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 假设 full_sample 和 ret_df 是您的原始DataFrame
# 这里我们创建一些模拟数据用于演示
data = {
    'feature1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'feature2': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
    'response': [0, 0, 0, 1, 1, 0, 1, 1, 0, 1]
}
full_sample = pd.DataFrame(data, index=[f'id_{i}' for i in range(10)])

# 模拟 ret_df,包含要进行预测的数据
ret_data = {
    'feature1': [1.5, 2.5, 3.5, 4.5, 5.5],
    'feature2': [9.5, 8.5, 7.5, 6.5, 5.5],
    'other_col': ['A', 'B', 'C', 'D', 'E']
}
ret_df = pd.DataFrame(ret_data, index=[f'new_id_{i}' for i in range(5)])

ind_cols = ['feature1', 'feature2']
dep_col = 'response'

# 1. 准备训练数据
X_train = full_sample[ind_cols]
y_train = full_sample[dep_col]

# 2. 训练逻辑回归模型
lm = LogisticRegression(fit_intercept=True)
lm.fit(X_train, y_train)

# 3. 准备待预测数据,并保留其原始索引
# 这一步至关重要:我们从 ret_df 中提取特征列,并确保它是一个Pandas DataFrame,
# 从而保留了原始的索引信息。
df1 = ret_df[ind_cols] # 已经是一个Pandas DataFrame,无需再调用 .to_pandas()

# 4. 获取预测概率
y_pred = lm.predict_proba(df1)

# 5. 将预测概率转换为DataFrame,并显式指定其索引为 df1 的索引
# 这一步是关键,确保 y_final 的索引与 df1 完全对齐
y_final = pd.DataFrame(y_pred, columns=['Prob_0', 'Prob_1'], index=df1.index)

# 6. 使用 pd.concat 将预测结果与原始数据合并
# 由于 df1 和 y_final 的索引已经对齐,使用 concat(axis=1) 是最安全和高效的方式。
ret_df_out = pd.concat([df1, y_final], axis=1)

# 如果需要将预测结果合并回原始的 ret_df (包含 'other_col'),
# 可以通过 df1.index 进行合并,或者直接将 y_final 合并到 ret_df
ret_df_with_predictions = pd.concat([ret_df, y_final], axis=1)

print("带有预测概率的原始数据帧 (ret_df_with_predictions):")
print(ret_df_with_predictions)

代码解析:

  1. df1 = ret_df[ind_cols]: 这一步从原始的ret_df中提取用于预测的特征列。关键在于df1仍然是一个Pandas DataFrame,它继承了ret_df的原始索引。
  2. y_pred = lm.predict_proba(df1): 模型对df1进行预测,返回一个NumPy数组y_pred。
  3. y_final = pd.DataFrame(y_pred, columns=['Prob_0', 'Prob_1'], index=df1.index): 这是解决问题的核心。在创建y_final这个DataFrame时,我们不再让它使用默认的RangeIndex,而是显式地将df1.index作为其索引。由于df1的索引是原始ret_df的索引,这确保了y_final的每一行预测概率都与ret_df中对应的原始行正确关联。
  4. ret_df_out = pd.concat([df1, y_final], axis=1): 因为df1和y_final现在拥有完全相同的、对齐的索引,使用pd.concat(axis=1)是合并它们的最佳方式。它会按索引将两个DataFrame水平拼接起来,确保数据行的正确匹配。
  5. ret_df_with_predictions = pd.concat([ret_df, y_final], axis=1): 如果需要将预测结果合并回包含所有原始列(包括非特征列如other_col)的ret_df,同样可以直接使用pd.concat,因为ret_df和y_final的索引是匹配的。

注意事项与最佳实践

  • 索引的重要性:Pandas的索引是数据完整性的基石。在进行任何数据转换、模型预测和结果合并时,始终要关注DataFrame的索引是否保持一致。
  • 避免隐式索引:当从NumPy数组创建Pandas DataFrame时,除非你确定需要一个默认的RangeIndex,否则最好显式地指定索引,以避免潜在的对齐问题。
  • pd.concat vs pd.merge:当两个DataFrame的索引已经完全对齐,并且你希望将它们按列拼接时,pd.concat(axis=1)通常比pd.merge(left_index=True, right_index=True)更简洁和高效。merge更适用于基于列值或非完全对齐索引的复杂连接场景。
  • 数据预处理:确保用于训练模型和进行预测的数据在列顺序、数据类型等方面保持一致。

总结

正确地将Scikit-learn模型生成的预测概率合并回原始Pandas DataFrame是数据分析流程中一个常见但关键的步骤。通过理解predict_proba的输出特性和Pandas索引管理的重要性,并采用显式指定索引的方法,我们可以避免数据错位的问题,确保预测结果的准确性和可靠性。上述提供的解决方案提供了一种健壮且易于理解的方法,可以有效解决此类索引对齐挑战。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

320

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

232

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

431

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2671

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

534

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

462

2026.02.12

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

120

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn