想象一下,我有4个行长不同但列数相同的数据帧,如下:df1(200行,4列(、df2(100,4(、df3(300,4(和df4(250,4(。
我想在这些数据帧之间进行监督分类(总是使用3进行训练,使用1进行测试/验证(,并发现哪种组合能给我更好的准确度分数这是一个数据量更大的例子,我想通过进行交叉验证来实现自动化
我想我可以尝试为每个数据帧创建一个新的列,并使用它们的特定名称,然后连接所有数据帧。然后,也许可以创建一个掩码,通过这些新列来区分训练集和测试集。但我仍然不知道如何在它们之间进行交叉验证。
数据帧如下所示:
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学习分类算法。谢谢
您可以将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)