使用 sklearn 从多个数据样本中整理概率、预测和系数

Collate probabilities, predictions, coefficients from multiple samples of data using sklearn

我想将来自多个(随机)splits/samples 数据的所有行的 class 1 预测的模型概率组合到 python 中的单个数据帧中。

我知道并不是所有的行都会在每次拆分中被选中,但是如果数据采样被复制了足够多的次数,每行至少会被选中几次并生成模型概率。

我目前的方法基本上是创建多个测试训练拆分(在下面的示例中为 5 个),并将每个训练实例的概率整理到一个数据帧中,如下面的代码和模拟数据集所示:

import pandas as pd
import numpy as np

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split


####Instantiate logistic regression objects
log = LogisticRegression(class_weight='balanced', random_state = 1)

#### import some data 
iris = datasets.load_iris()

X = pd.DataFrame(iris.data[:100, :], columns = ["sepal_length", "sepal_width", "petal_length", "petal_width"])
y = iris.target[:100,]

# start by creating the first column of probs table
probs_table = pd.DataFrame(X.index, columns=["members"])

# iterate over random states while keeping track of `i`
for i, state in enumerate([11, 444, 21, 109, 1900]):
    train_x, test_x, train_y, test_y = train_test_split(
        X, y, stratify=y, test_size=0.2, random_state=state)
    pd.DataFrame(log.predict_proba(test_x)[:, 1])  #fit final model 

    probs_table[f"iter_{i+1}"] = pd.DataFrame(log.predict_proba(test_x)[:, 1])
    
probs_table

不幸的是,我没有得到数据框中所有行的概率。有人可以指导我解决这个问题吗?最好包括额外的模型输出,例如每个 iteration/data 行的预测、系数。

只要可以为所有数据帧行组装概率,任何其他方式对数据进行采样(即除测试训练拆分之外)都可以。

代码存在一些问题:

  1. .fit() 从不在这里调用。我假设您希望它正好位于 train/test 分割线之后和 predict_proba() 调用之前?

  2. 当您将值放入数据框中时,您正在创建一个新列,我假设您想要一列用于所有迭代,同时跟踪每一列中它来自哪个迭代?

这是我认为可以完成您想要的代码。它 1) 遍历每个随机状态整数,2) 创建一个新的 train/test 拆分,3) 每次都拟合一个新模型,以及 4) 在每个测试集行上进行预测。

我还让它跟踪原始索引,这样您就可以看到每个原始行最终出现在预测数据框中的次数:

编辑: 将系数作为一列包含在内

import pandas as pd

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

####Instantiate logistic regression objects
log = LogisticRegression(class_weight='balanced', random_state = 1)

#### import some data 
iris = datasets.load_iris()

X = pd.DataFrame(iris.data[:100, :], columns = ["sepal_length", "sepal_width", "petal_length", "petal_width"])
y = iris.target[:100,]

dfs = []
# iterate over random states while keeping track of `i`
for i, state in enumerate([11, 444, 21, 109, 1900]):
    train_x, test_x, train_y, test_y = train_test_split(
        X, y, stratify=y, test_size=0.2, random_state=state)
    log.fit(train_x, train_y)
    preds = log.predict_proba(test_x)[:, 1]
    orig_indices = test_x.index
    df = pd.DataFrame(data={
        "orig_index": orig_indices, 
        "prediction": preds, 
        "iteration": f"iter_{i+1}",
        "coefficients": [log.coef_[0]] * len(preds)})    
    dfs.append(df)

probs_table = pd.concat(dfs)
probs_table