使用 train_test_split() 后向我的 x_test 和 y_test 添加额外的实例

Add extra instances to my x_test and y_test after using train_test_split()

我正在处理一个多 class class 化问题,我将我的数据分类为 8 classes。

我想做的是从我的训练数据集中提取与一个 class化相关的所有实例,并包含在我的测试数据集中。

到目前为止我所做的是:

# Generate some data
df = pd.DataFrame({
    'x1': np.random.normal(0, 1, 100),
    'x2': np.random.normal(2, 3, 100),
    'x3': np.random.normal(4, 5, 100),
    'y': np.random.choice([0, 1, 2, 3, 4, 5, 6, 7], 100)})

df.head(10)


# Output is as follows
#         x1        x2        x3   y
# 0 -0.742347 -2.064889  2.979338  6
# 1  0.182298  6.366811  7.435432  7 <-- Instance no. 1 will be stored in (filtered_df) in the next step
# 2 -1.015937 -3.214670  8.544494  4
# 3  0.688138  1.938480  4.028213  6
# 4  0.397756  0.064590  9.186234  5
# 5  0.095368 -3.255433  1.010394  1
# 6  0.609087  6.783653  4.390600  6
# 7 -0.017803 -1.571393  6.539134  5
# 8  0.814820  4.535381  2.175285  0
# 9 -0.573918 -0.672416  0.826967  6



# Taking out instances that are classified as no "7" from the dataset
filtered_df = df[df['y']==7]
df.drop(df[df['y']==7].index, inplace=True)
df.head(10)

# Output is as follows
#          x1        x2        x3   y
# 0  -0.742347 -2.064889  2.979338  6
# 2  -1.015937 -3.214670  8.544494  4 <-- Instance no. 1 is stored in (filtered_df) now
# 3   0.688138  1.938480  4.028213  6
# 4   0.397756  0.064590  9.186234  5
# 5   0.095368 -3.255433  1.010394  1
# 6   0.609087  6.783653  4.390600  6
# 7  -0.017803 -1.571393  6.539134  5
# 8   0.814820  4.535381  2.175285  0
# 9  -0.573918 -0.672416  0.826967  6
# 11  0.044094  2.581373  1.368575  5

# Extract the features and target
X = df.iloc[:, 0:3]
y = df.iloc[:, 3]

# Spliting the dataset into train, test and validate for binary classification
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)

## Not sure how to add (filtered_df) to X_test and y_test now ?

我不确定如何继续。如何将存储在 filtered_df 中的实例添加到 x_testy_test 中?

IIUC:

for klass in df['y'].unique():
    m = df['y'] != klass
    X = df.loc[m, df.columns[:3]]
    y = df.loc[m, df.columns[-1]]
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)
    X_test = X_test.append(df.loc[~m, df.columns[:3]])
    y_test = y_test.append(df.loc[~m, df.columns[-1]])
    # do stuff here
    ...

一点回答,一点请求更多信息(还不能发表评论)。

如果您只想合并数据帧,.append() 可能是正确的选择。

在您对代码块的评论中,您说您将数据集拆分为二进制 class化,但在问题描述中您提到了多class class化.

我认为有两种方法可以解决这个问题:

  • 作为一个完整的多 class class 化(在这种情况下,出于某种原因你不需要只分离一个 class)使用本身支持多个 classes 或

    的模型
  • 一系列二进制 classifiers 目的是稍后集成它们(你应该为第一个 class 与所有创建数据集的副本,第二个 class vs all 等等,但是 sklearn 已经用 sklearn.multiclass.OneVsRestClassifier) 处理了。然后,您可以从每个模型(如果支持)中获取概率,并选择概率最大的最终预测 class。

以防万一您还没有看到它,也许值得在 sklearn's "Multiclass and multioutput algorithms" page 中看一看。