a

Câu hỏi mã hóa nhãn mã hóa bị thiếu giá trị


Tôi đang sử dụng bộ mã hóa nhãn để chuyển đổi dữ liệu phân loại thành các giá trị số.

Làm thế nào để LabelEncoder xử lý các giá trị bị thiếu?

from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy as np
a = pd.DataFrame(['A','B','C',np.nan,'D','A'])
le = LabelEncoder()
le.fit_transform(a)

Đầu ra:

array([1, 2, 3, 0, 4, 1])

Đối với ví dụ trên, bộ mã hóa nhãn đã thay đổi giá trị NaN thành một danh mục. Làm cách nào để biết danh mục nào đại diện cho các giá trị bị thiếu?


14
2018-04-23 08:23


gốc




Các câu trả lời:


Không sử dụng LabelEncoder với giá trị bị thiếu. Tôi không biết phiên bản nào của scikit-learn bạn đang sử dụng, nhưng trong 0,17.1 mã của bạn tăng TypeError: unorderable types: str() > float().

Bạn có thể thấy trong nguồn nó sử dụng numpy.unique chống lại dữ liệu để mã hóa, tăng TypeError nếu tìm thấy giá trị bị thiếu. Nếu bạn muốn mã hóa các giá trị bị thiếu, trước tiên hãy thay đổi loại của nó thành một chuỗi:

a[pd.isnull(a)]  = 'NaN'

7
2018-04-23 17:52



Vì vậy, bạn sẽ được mã hóa 'NaN' như là một giá trị giả? Tôi có cùng một vấn đề nhưng muốn sử dụng giá trị được gán cho hồi quy tuyến tính. - Scott Davis


Bạn có thể điền vào của na bởi một số giá trị và sau đó thay đổi kiểu cột dataframe thành chuỗi để làm cho mọi thứ hoạt động.

from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy as np
a = pd.DataFrame(['A','B','C',np.nan,'D','A'])
a.fillna(99)
le = LabelEncoder()
le.fit_transform(a.astype(str))

2
2018-03-13 08:18





Xin chào một chút tính toán hack tôi đã làm cho công việc của riêng tôi:

from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy as np
a = pd.DataFrame(['A','B','C',np.nan,'D','A'])
le = LabelEncoder()
### fit with the desired col, col in position 0 for this example
fit_by = pd.Series([i for i in a.iloc[:,0].unique() if type(i) == str])
le.fit(fit_by)
### Set transformed col leaving np.NaN as they are
a["transformed"] = fit_by.apply(lambda x: le.transform([x])[0] if type(x) == str else x)

2
2018-05-10 18:01



fit_by là danh sách, danh sách không có .apply() phương pháp, xin vui lòng chính xác - gboffi


Đây là giải pháp của tôi, bởi vì tôi không hài lòng với các giải pháp được đăng ở đây. Tôi cần một LabelEncoder giữ các giá trị còn thiếu của tôi là 'NaN' để sử dụng một Imputer sau đó. Vì vậy, tôi đã viết lớp LabelEncoder của riêng tôi. Nó hoạt động với DataFrames.

from sklearn.base import BaseEstimator
from sklearn.base import TransformerMixin
from sklearn.preprocessing import LabelEncoder

class LabelEncoderByCol(BaseEstimator, TransformerMixin):
    def __init__(self,col):
        #List of column names in the DataFrame that should be encoded
        self.col = col
        #Dictionary storing a LabelEncoder for each column
        self.le_dic = {}
        for el in self.col:
            self.le_dic[el] = LabelEncoder()

    def fit(self,x,y=None):
        #Fill missing values with the string 'NaN'
        x[self.col] = x[self.col].fillna('NaN')
        for el in self.col:
            #Only use the values that are not 'NaN' to fit the Encoder
            a = x[el][x[el]!='NaN']
            self.le_dic[el].fit(a)
        return self

    def transform(self,x,y=None):
        #Fill missing values with the string 'NaN'
        x[self.col] = x[self.col].fillna('NaN')
        for el in self.col:
            #Only use the values that are not 'NaN' to fit the Encoder
            a = x[el][x[el]!='NaN']
            #Store an ndarray of the current column
            b = x[el].get_values()
            #Replace the elements in the ndarray that are not 'NaN'
            #using the transformer
            b[b!='NaN'] = self.le_dic[el].transform(a)
            #Overwrite the column in the DataFrame
            x[el]=b
        #return the transformed DataFrame
        return x

Bạn có thể nhập một DataFrame, không chỉ một Series 1-dim. với col bạn có thể chọn các cột cần được mã hóa.

Tôi muốn ở đây một số phản hồi.


2
2017-08-07 10:26





Tôi phải đối mặt với cùng một vấn đề nhưng không ai trong số trên làm việc cho tôi. Vì vậy, tôi đã thêm một hàng mới vào dữ liệu đào tạo chỉ bao gồm "nan"


0
2017-08-29 15:11