如何为监督分类生成不同数据帧的交叉验证?
How to generate cross validation over different dataframes for supervised classification?
假设我有 4 个数据帧,行长不同但列数相同,如下所示:df1(200 行,4 列)、df2(100, 4)、df3(300, 4) 和 df4(250, 4).
我想在这些数据帧之间进行监督分类(总是使用 3 个用于训练,1 个用于 test/validation)并发现哪个组合给我更好的准确度分数。 这是一个更大数据量的例子,我想通过交叉验证来自动化它。
我想我可以尝试为每个数据框创建一个具有特定名称的新列,然后将它们全部连接起来。然后,也许可以创建一个掩码,通过这些新列来区分训练集和测试集。但是我仍然不知道如何在它们之间进行交叉验证。
数据帧应该是这样的:
concatenated_dfs:
feat1 feat2 feat3 feat4 name
0 4 6 57 78 df1
1 1 2 50 78 df1
2 1 1 57 78 df1
. . . . . .
. . . . . .
. . . . . .
849 3 10 50 80 df4
谁能告诉我如何用一些代码来做到这一点?如果需要,您可以使用任何 scikit-learn 分类算法。谢谢!
您可以将 scikit learn 的 cross_val_score
与自定义迭代器结合使用,为数据中的训练测试拆分生成索引。这是一个例子:
# Setup - creating fake data to match your description
df = pd.DataFrame(data={"name":[x for l in [[f"df{i}"]*c for i, c in enumerate(counts, 1)] for x in l]})
for i in range(1, 5):
df[f"feat{i}"] = np.random.randn(len(df))
X = df[[c for c in df.columns if c != "name"]]
y = np.random.randint(0, 2, len(df))
# Iterable to generate the training-test splits:
indices = list()
for name in df["name"].unique():
train = df.loc[df["name"] != name].index
test = df.loc[df["name"] == name].index
indices.append((train, test))
# Example model - logistic regression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
# Using cross-val score with the custom indices:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=indices)
假设我有 4 个数据帧,行长不同但列数相同,如下所示:df1(200 行,4 列)、df2(100, 4)、df3(300, 4) 和 df4(250, 4).
我想在这些数据帧之间进行监督分类(总是使用 3 个用于训练,1 个用于 test/validation)并发现哪个组合给我更好的准确度分数。 这是一个更大数据量的例子,我想通过交叉验证来自动化它。
我想我可以尝试为每个数据框创建一个具有特定名称的新列,然后将它们全部连接起来。然后,也许可以创建一个掩码,通过这些新列来区分训练集和测试集。但是我仍然不知道如何在它们之间进行交叉验证。
数据帧应该是这样的:
concatenated_dfs:
feat1 feat2 feat3 feat4 name
0 4 6 57 78 df1
1 1 2 50 78 df1
2 1 1 57 78 df1
. . . . . .
. . . . . .
. . . . . .
849 3 10 50 80 df4
谁能告诉我如何用一些代码来做到这一点?如果需要,您可以使用任何 scikit-learn 分类算法。谢谢!
您可以将 scikit learn 的 cross_val_score
与自定义迭代器结合使用,为数据中的训练测试拆分生成索引。这是一个例子:
# Setup - creating fake data to match your description
df = pd.DataFrame(data={"name":[x for l in [[f"df{i}"]*c for i, c in enumerate(counts, 1)] for x in l]})
for i in range(1, 5):
df[f"feat{i}"] = np.random.randn(len(df))
X = df[[c for c in df.columns if c != "name"]]
y = np.random.randint(0, 2, len(df))
# Iterable to generate the training-test splits:
indices = list()
for name in df["name"].unique():
train = df.loc[df["name"] != name].index
test = df.loc[df["name"] == name].index
indices.append((train, test))
# Example model - logistic regression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
# Using cross-val score with the custom indices:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=indices)