使用 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_test
和 y_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 中看一看。
我正在处理一个多 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_test
和 y_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 中看一看。