Python 隔离林:分类数据

Python 隔离林:分类数据,python,scikit-learn,categorical-data,outliers,anomaly-detection,Python,Scikit Learn,Categorical Data,Outliers,Anomaly Detection,我试图在sklearn中使用隔离林检测乳腺癌数据集中的异常。我试图将Iolation Forest应用于混合数据集,当我拟合模型时,它会给我值错误 这是我的数据集: 这是我的代码: from sklearn.model_selection import train_test_split rng = np.random.RandomState(42) X = data_cancer.drop(['Class'],axis=1) y = data_cancer['Class'] X_trai

我试图在sklearn中使用隔离林检测乳腺癌数据集中的异常。我试图将Iolation Forest应用于混合数据集,当我拟合模型时,它会给我值错误

这是我的数据集:

这是我的代码:

from sklearn.model_selection import train_test_split
rng = np.random.RandomState(42)

X = data_cancer.drop(['Class'],axis=1)
y = data_cancer['Class'] 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 20)
X_outliers = rng.uniform(low=-4, high=4, size=(X.shape[0], X.shape[1]))

clf = IsolationForest()
clf.fit(X_train)
这是我得到的错误:

ValueError:无法将字符串转换为浮点:“30-39”


是否可以对分类数据使用隔离林?如果是,我该怎么做?

您应该将分类数据编码为数字表示

有很多方法可以对分类数据进行编码,但我建议您从

sklearn.preprocessing.LabelEncoder
如果基数高,
sklearn.preprocessing.onehotcoder
如果基数低

下面是一个使用示例:

将numpy导入为np
从numpy导入argmax
从sklearn.preprocessing导入标签编码器
从sklearn.preprocessing导入OneHotEncoder
#定义示例
数据=[“冷”、“冷”、“暖”、“冷”、“热”、“热”、“暖”、“冷”、“暖”、“热”、“热”]
值=np.数组(数据)
打印(值)
#整数编码
label_编码器=LabelEncoder()
整数编码=标签编码器。拟合变换(值)
打印(整数编码)
#二进制编码
onehot_编码器=OneHotEncoder(稀疏=假)
整数编码=整数编码。重塑(len(整数编码),1)
onehot\u encoded=onehot\u编码器。拟合\u变换(整数\u编码)
打印(onehot_编码)
#颠倒第一个例子
反向=标签编码器。反向变换([argmax(onehot\u编码的[0,:]))
打印(倒置)
输出:

['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']
 
[0 0 2 0 1 1 2 0 2 1]
 
[[ 1.  0.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  1.  0.]]
 
['cold']

好的,但是如果我想用自己的输入进行预测,我该怎么办呢。我写了
input\u par=encoder.transform(['string value 1','string value 2'…])
,但我得到了一个错误:
使用数组重塑数据。如果数据具有单个特征或数组,则重塑(-1,1)。如果数据包含单个样本,则重塑(1,-1)。
@Farseer忘记添加:
来自数组导入数组,你的玩具示例对我不起作用。我得到一个错误:
TypeError:array()参数1或typecode必须是char(字符串或长度为1的ascii unicode),而不是list
(使用Python 2)。@user2205916只需替换
values=np.array(data)
而不是
values=array(data)
,它就可以工作了。