使用 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 行的预测、系数。
只要可以为所有数据帧行组装概率,任何其他方式对数据进行采样(即除测试训练拆分之外)都可以。
代码存在一些问题:
.fit()
从不在这里调用。我假设您希望它正好位于 train/test 分割线之后和 predict_proba() 调用之前?
当您将值放入数据框中时,您正在创建一个新列,我假设您想要一列用于所有迭代,同时跟踪每一列中它来自哪个迭代?
这是我认为可以完成您想要的代码。它 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
我想将来自多个(随机)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 行的预测、系数。
只要可以为所有数据帧行组装概率,任何其他方式对数据进行采样(即除测试训练拆分之外)都可以。
代码存在一些问题:
.fit()
从不在这里调用。我假设您希望它正好位于 train/test 分割线之后和 predict_proba() 调用之前?当您将值放入数据框中时,您正在创建一个新列,我假设您想要一列用于所有迭代,同时跟踪每一列中它来自哪个迭代?
这是我认为可以完成您想要的代码。它 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