首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:编码器要求它们的输入是一致的字符串或数字。有['int','str']

TypeError:编码器要求它们的输入是一致的字符串或数字。有['int','str']
EN

Stack Overflow用户
提问于 2022-02-20 11:04:02
回答 1查看 7.7K关注 0票数 4

我已经引用了这里这里这里的帖子。不要把它标记为重复。

我正在处理一个二进制分类问题,其中我的数据集有分类列和数字列。

但是,一些分类列有数值和字符串值的混合。但是,它们只表示类别名称。

例如,我有一个名为biz_category的列,它的值类似于A,B,C,4,5等。

我想下面的错误是由于像4 and 5这样的值引发的。

因此,我尝试使用下面的方法将它们转换为category数据类型。(但仍然不起作用)

代码语言:javascript
复制
cols=X_train.select_dtypes(exclude='int').columns.to_list()
X_train[cols]=X_train[cols].astype('category')

我的数据信息如下所示

代码语言:javascript
复制
<class 'pandas.core.frame.DataFrame'>
Int64Index: 683 entries, 21 to 965
Data columns (total 9 columns):
 #   Column                                           Non-Null Count  Dtype   
---  ------                                           --------------  -----   
 0   Feature_A                                        683 non-null    category
 1   Product Classification                           683 non-null    category
 2   Industry                                         683 non-null    category
 3   DIVISION                                         683 non-null    category
 4   biz_category                                     683 non-null    category
 5   Country                                          683 non-null    category
 6   Product segment                                  683 non-null    category
 7   SUBREGION                                        683 non-null    category
 8   Quantity 1st year                                683 non-null    int64   
dtypes: category(8), int64(1)

因此,在dtype转换之后,当我尝试下面的SMOTENC时,会得到一个错误

代码语言:javascript
复制
print("Before OverSampling, counts of label '1': {}".format(sum(y_train == 1)))
print("Before OverSampling, counts of label '0': {} \n".format(sum(y_train == 0)))
cat_index = [0,1,2,3,4,5,6,7]
# import SMOTE module from imblearn library
# pip install imblearn (if you don't have imblearn in your system)
from imblearn.over_sampling import SMOTE, SMOTENC
sm = SMOTENC(categorical_features=cat_index,random_state = 2,sampling_strategy = 'minority')
X_train_res, y_train_res = sm.fit_resample(X_train, y_train)

这将导致一个错误,如下所示

跟踪(最近一次调用) ~\AppData\Roaming\Python\Python39\site-packages\sklearn\utils_encode.py in _unique_python(值,( return_inverse) 134 --> 135个单子=排序(Uniques_set)136个uniques.extend(missing_values.to_list()) TypeError:“str”和“int”的实例之间不支持< 在处理上述异常的过程中,发生了另一个异常: Smotenc7sm= SMOTENC(categorical_features=cat_index,random_state = 2,sampling_strategy =‘X_train_res’)->8 X_train_res,y_train_res = sm.fit_resample(X_train,y_train) 9 10打印(‘OverSampling后,train_X:{}‘.format(X_train_res.shape)的形状 ~\AppData\Roaming\Python\Python39\site-packages\imblearn\base.py in fit_resample(self,X,y) 81 ) 82 --> 83输出= self.fit_resample(X,y) 84 85 y=( ~\AppData\Roaming\Python\Python39\site-packages\imblearn\over_sampling_smote\base.py in fit_resample(self,X,y) 511512# OneHotEncoder的输入必须是密集的--> 513 X_ohe = self.ohe.fit_transform(如果sparse.issparse( X_categorical ) X_ohe(X_categorical)X_categorical 515 ) ~\AppData\Roaming\Python\Python39\site-packages\sklearn\preprocessing_encoders.py in fit_transform(self,X,y) 486“”487 self._validate_keywords() --> 488返回.fit_transform(X,y) 489 490 def变换(self,X): ~\AppData\Roaming\Python\Python39\site-packages\sklearn\base.py in fit_transform(self,X,y,**fit_params) 850,如果y为0: 851 #适合度1(无监督变换)-> 852返回self.fit(X,**fit_params).transform(X) 853 of : 854 #拟合度2(监督变换) ~\AppData\Roaming\Python\Python39\site-packages\sklearn\preprocessing_encoders.py in fit( self,X,y) 459“”460 self._validate_keywords() -> 461 self.fit(X,handle_unknown=self.handle_unknown,force_all_finite=“allow nan”) 462 self.drop_idx = self._compute_drop_idx() 463返回 ~\AppData\Roaming\Python\Python39\site-packages\sklearn\preprocessing_encoders.py in _fit(self,X,handle_unknown,force_all_finite) 92 Xi = X_listi 93 if self.categories == "auto":--> 94 cat= _unique(Xi) 95 #en0#:96猫= np.array(self.categoriesi,dtype=Xi.dtype) ~\AppData\Roaming\Python\Python39\site-packages\sklearn\utils_encode.py in _unique(值,return_inverse) 29“”30如果values.dtype ==对象:--> 31返回_unique_python(值,return_inverse=return_inverse) 32 #数值33 out =np.unique(值,return_inverse=return_inverse) ~\AppData\Roaming\Python\Python39\site-packages\sklearn\utils_encode.py in _unique_python(values,return_inverse) 138,除了TypeError: 139 types =t in set(type(v)表示v in TypeError)-> 140举起TypeError( 141个“编码器要求输入的字符串或数字为一致的”142f“。Got {type} TypeError:编码器要求它们的输入是一致的字符串或数字。有“int”,“str”

我应该把y_train也转换成分类吗?目前,它是int64

请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-20 14:22:07

问题的原因

SMOTE要求每个分类/数字列中的值具有统一的数据类型。本质上,您不能在任何一列中具有混合数据类型--在本例中是biz_category列。此外,仅仅将列转换为分类类型并不一定意味着该列中的值将具有统一的数据类型。

可能解决办法

解决这个问题的一个可能的解决方案是重新编码那些具有混合数据类型的列中的值,例如,您可以使用Lable编码器,但我认为,在您的示例中,简单地将dtype更改为string也是可行的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71193740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档