2017-02-13 109 views
0

机器学习/ Python Noob here。有人可以向我解释下面的代码吗?我不明白下面的线路是如何工作的。需要Scikit代码说明

# This line in the code below, what does it do? 
label_encoder.append(preprocessing.LabelEncoder()) 

label_encoder = [] 
X_encoded = np.empty(X.shape) 
for i,item in enumerate(X[0]): 
    if item.isdigit(): 
     X_encoded[:, i] = X[:, i] 
    else: 
     label_encoder.append(preprocessing.LabelEncoder()) 
     X_encoded[:, i] = label_encoder[-1].fit_transform(X[:, i]) 

谢谢!

+0

它将'LabelEncoder'的一个实例添加到列表中;该实例适用于后续行。 (投票迁移。) –

回答

3

label_encoder是一个列表,它在python中是一个有序集合,您可以使用它来存储任何类型的对象。它被错误地命名,它应该是label_encoders,plurl。

我们首先创建一个空的:

label_encoders = [] 

然后,当我们遇到需要编码列

if item.isdigit(): 
    # Don't need to endcode. 
else: 
    # Do need to encode. 

我们创建了一个新的preprocessing.LabelEncoder()对象,并将其保存以备后用

label_encoders.append(preprocessing.LabelEncoder()) 

最后,我们使用最近创建的LabelEncoder对象实际编码列

X_encoded[:, i] = label_encoders[-1].fit_transform(X[:, i]) 

我们需要存储新LabelEncoder对象地方,因为我们几乎肯定会遇到在未来的测试集或新的生产数据,并且将需要编码数据就像我们编码我们的训练数据一样。

我可能会写这样的代码,这是稍微更清晰

label_encoders = [] 
X_encoded = np.empty(X.shape) 
for i, item in enumerate(X[0]): 
    if item.isdigit(): 
     X_encoded[:, i] = X[:, i] 
    else: 
     label_encoder = preprocessing.LabelEncoder() 
     X_encoded[:, i] = label_encoder.fit_transform(X[:, i]) 
     label_encoders.append(label_encoder) 

谢谢!我没有意识到preprocessing.LabelEncoder()返回一个列表。

它不!列表来自行

label_encoders = [] 

preprocessing.LabelEncoder()调用返回一个LabelEncoder类型的对象。这实现了sklearn transformation interface,它允许您使用fit_transformtransform方法对您的要素进行编码。

+0

谢谢!我没有意识到preprocessing.LabelEncoder()返回一个列表。最后的追加现在更有意义。 – adamcamroon

+0

@adamcamroon我认为你仍然有一个误解。我对我的答案进行了更多解释。 –