- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用一个数据集 (KDD-cup-99),该数据集包含数千个样本和大约 41 个特征,用于我的一个机器学习项目。这本质上是使用 TCP DUMP 收集的特定网络的数据包捕获。
我使用了 scikit-learn train_test_split 函数,如下所示
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42)
分割后,上面的每一个都有下面的形状。
X_train : (444618, 41)
y_train : (444618,)
X_test : (49403, 41)
y_test : (49403,)
在 41 个特征中,有 3 个特征是字符串类型。使用这些数据的人可以理解这些。这三个是:protocol_type、service 和 flag。
我将这三个特征数组从训练样本和测试样本中分离出来,对训练样本和测试样本分别进行了标签编码和1hot编码。现在这三个特征的数组大小如下:
X_train_obj1: (444618, 3)
X_train_obj2: (444618, 65)
X_train_obj3: (444618, 11)
X_test_obj1: (49403, 3)
X_test_obj2: (49403, 64)
X_test_obj3: (49403, 11)
这就是我遇到问题的地方。由于某种原因,train_obj2 有 65 个特征/列,而 test_obj2 数组有 64 个特征/列。当稍后将这些标准算法(如 KNeighborClassifier、SVM 等)与各自的训练集和测试集合并并开始使用它们时,这会导致应用标准算法的任何拟合/预测方法时出现问题。 API 失败并显示错误,指示大小不一致。
对应代码:
label_encoder = LabelEncoder()
train_proto_label_encoded =
label_encoder.fit_transform(X_train_obj['protocol_type'])
train_srv_label_encoded =
label_encoder.fit_transform(X_train_obj['service'])
train_flag_label_encoded =
label_encoder.fit_transform(X_train_obj['flag'])
test_proto_label_encoded =
label_encoder.fit_transform(X_test_obj['protocol_type'])
test_srv_label_encoded =
label_encoder.fit_transform(X_test_obj['service'])
test_flag_label_encoded =
label_encoder.fit_transform(X_test_obj['flag'])
hot_encoder = OneHotEncoder()
train_proto_1hot_encoded =
hot_encoder.fit_transform(train_proto_label_encoded.reshape(-1, 1))
train_srv_1hot_encoded =
hot_encoder.fit_transform(train_srv_label_encoded.reshape(-1, 1))
train_flag_1hot_encoded =
hot_encoder.fit_transform(train_flag_label_encoded.reshape(-1, 1))
test_proto_1hot_encoded =
hot_encoder.fit_transform(test_proto_label_encoded.reshape(-1, 1))
test_srv_1hot_encoded =
hot_encoder.fit_transform(test_srv_label_encoded.reshape(-1, 1))
test_flag_1hot_encoded =
hot_encoder.fit_transform(test_flag_label_encoded.reshape(-1, 1))
我使用 print 语句进行了一些调试,本质上训练集获取了所有 65 种不同类型服务的样本,而测试集仅获取了 64 种不同类型服务的样本。
你能帮助我理解并解决这个问题吗?
1) 当我们使用 scikit-learn API 进行标签编码和 1_hot_encoding 时,这种行为是否是预期的?
2) 在这种情况下,如何修复并确保训练数据集和测试数据集都具有所有服务类型或字符串类型?
如果需要,我可以将完整的代码添加到问题中。
最佳答案
1) 当我们使用 scikit-learn API 进行标签编码和 1_hot_encoding 时,这种行为是否是预期的?
是的,但这是因为你使用 fit_transform 的方式错误
2) 在这种情况下,如何修复并确保训练数据集和测试数据集都具有所有服务类型或字符串类型?
如果列车上并非所有的护理都在测试中,反之亦然,则必须在列车和测试数据上安装编码器。以便编码器考虑所有类别。
一旦编码器适合,您就可以在训练和测试上分别调用转换。您将获得相同数量的功能。
还有最后一个细节。如果您的类别仅用于测试,则使用这些类别训练模型可能会导致一些意外的行为。
关于machine-learning - Scikit-learn 标签编码后进行一种热编码,从而为训练数据集和测试数据集产生不同的特征集。如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51606209/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!