我正在处理一个二进制分类问题,其中我的数据集有分类列和数字列。
但是,一些分类列有数值和字符串值的混合。但是,它们只表示类别名称。
例如,我有一个名为biz_category的列,它的值类似于A,B,C,4,5等。
我想下面的错误是由于像4 and 5这样的值引发的。
因此,我尝试使用下面的方法将它们转换为category数据类型。(但仍然不起作用)
cols=X_train.select_dtypes(exclude='int').columns.to_list()
X_train[cols]=X_train[cols].astype('category')我的数据信息如下所示
<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时,会得到一个错误
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。
请帮帮忙
发布于 2022-02-20 14:22:07
问题的原因
SMOTE要求每个分类/数字列中的值具有统一的数据类型。本质上,您不能在任何一列中具有混合数据类型--在本例中是biz_category列。此外,仅仅将列转换为分类类型并不一定意味着该列中的值将具有统一的数据类型。
可能解决办法
解决这个问题的一个可能的解决方案是重新编码那些具有混合数据类型的列中的值,例如,您可以使用Lable编码器,但我认为,在您的示例中,简单地将dtype更改为string也是可行的。
https://stackoverflow.com/questions/71193740
复制相似问题