programing

get_dummies(판다스)와 OneHotEncoder(Scikit-learn)의 장단점은 무엇입니까?

lastcode 2023. 7. 21. 21:39
반응형

get_dummies(판다스)와 OneHotEncoder(Scikit-learn)의 장단점은 무엇입니까?

저는 기계 학습 분류기를 위해 범주형 변수를 숫자로 변환하는 다양한 방법을 배우고 있습니다.우연히 발견했습니다.pd.get_dummies 및 방법sklearn.preprocessing.OneHotEncoder()성능과 사용량 면에서 어떻게 차이가 나는지 알고 싶었습니다.

사용 방법에 대한 튜토리얼을 찾았습니다.OneHotEncoder()https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-work-on-categorical-features/ 에서.sklearn설명서가 이 기능에 그다지 도움이 되지 않았습니다.제가 제대로 하고 있지 않다는 느낌이 들어요...

어떤 사람들은 사용의 장단점을 설명할 수 있습니까?나는 그것을 알고 있습니다.OneHotEncoder()하지만 그 에는 어떻게 잘 pandas.요?제가 그것을 비효율적으로 사용하고 있나요?

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
sns.set()

%matplotlib inline

#Iris Plot
iris = load_iris()
n_samples, m_features = iris.data.shape

#Load Data
X, y = iris.data, iris.target
D_target_dummy = dict(zip(np.arange(iris.target_names.shape[0]), iris.target_names))

DF_data = pd.DataFrame(X,columns=iris.feature_names)
DF_data["target"] = pd.Series(y).map(D_target_dummy)
#sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
#0                  5.1               3.5                1.4               0.2   
#1                  4.9               3.0                1.4               0.2   
#2                  4.7               3.2                1.3               0.2   
#3                  4.6               3.1                1.5               0.2   
#4                  5.0               3.6                1.4               0.2   
#5                  5.4               3.9                1.7               0.4   

DF_dummies = pd.get_dummies(DF_data["target"])
#setosa  versicolor  virginica
#0         1           0          0
#1         1           0          0
#2         1           0          0
#3         1           0          0
#4         1           0          0
#5         1           0          0

from sklearn.preprocessing import OneHotEncoder, LabelEncoder
def f1(DF_data):
    Enc_ohe, Enc_label = OneHotEncoder(), LabelEncoder()
    DF_data["Dummies"] = Enc_label.fit_transform(DF_data["target"])
    DF_dummies2 = pd.DataFrame(Enc_ohe.fit_transform(DF_data[["Dummies"]]).todense(), columns = Enc_label.classes_)
    return(DF_dummies2)

%timeit pd.get_dummies(DF_data["target"])
#1000 loops, best of 3: 777 µs per loop

%timeit f1(DF_data)
#100 loops, best of 3: 2.91 ms per loop

기계 학습을 위해서는 거의 확실히 사용하기를 원합니다.단순 분석과 같은 다른 작업의 경우 다음을 사용할 수 있습니다.pd.get_dummies그게 좀 더 편리합니다.

:sklearn.OneHotEncoder범주형 변수와 정수에 대한 문자열을 허용하도록 최신 버전으로 업데이트되었습니다.

그것의 핵심은sklearn인코더는 동일한 범주형 변수를 사용하는 새 데이터 세트에 적용할 수 있는 기능을 생성하여 일관된 결과를 제공합니다.

from sklearn.preprocessing import OneHotEncoder

# Create the encoder.
encoder = OneHotEncoder(handle_unknown="ignore")
encoder.fit(X_train)    # Assume for simplicity all features are categorical.

# Apply the encoder.
X_train = encoder.transform(X_train)
X_test = encoder.transform(X_test)

생성한 것과 동일한 인코더를 적용하는 방법에 주목합니다.X_train 세트 새데 세로 트X_test.

다음과 같은 경우에 발생하는 상황을 고려합니다.X_test에는 포하는수있습다니준이함▁▁levels와 다른 수준이 되어 있습니다.X_train변수 중 하나에 대해.를 들어를들어들, 예를어예,,X_train["color"]에는 만포만 포함됩니다."red"그리고."green" 그것들에도, 하만그것외에도들지외도.X_test["color"] 함할수 있다니를 포함하기도 합니다."blue".

사용할 경우pd.get_dummies,X_test인 결추로것발다입니할생가국▁an로 끝납니다."color_blue"어느 칼럼X_train그렇지 않습니다, 그리고 불일치는 아마도 나중에 우리의 코드를 깰 것입니다, 특히 우리가 먹이를 주고 있다면.X_test완전히sklearn가 리가훈련모델에서 한 모델X_train.

한 하려면 그고만약우한번하예나를받프는로서에데원면션이이다한를처를렇터기리게하리덕의에리가▁and,▁like원면▁at기를하한다▁the▁this▁dataion.pd.get_dummies쓸모가 없을 겁니다

와 함께sklearn.OneHotEncoder반면, 인코더를 만든 후에는 매번 동일한 출력을 생성하기 위해 재사용할 수 있습니다."red"그리고."green"그리고 때 어떤 할 수 ."blue"만약 우리가 그것이 불가능하다고 생각한다면, 우리는 그것에게 오류를 던지라고 말할 수 있습니다.handle_unknown="error"그렇지 않으면 우리는 계속하라고 말할 수 있고 단순히 빨간색과 녹색 열을 0으로 설정할 수 있습니다.handle_unknown="ignore".

OneHotEncoder문자열 값을 직접 처리할 수 없습니다.공칭 형상이 문자열인 경우 먼저 정수로 매핑해야 합니다.

pandas.get_dummies그 반대입니다.기본적으로 열이 지정되지 않은 경우 문자열 열은 단일 핫 표현으로만 변환됩니다.

칼의 답변이 너무 마음에 들어서 찬성표를 던졌습니다.더 많은 사람들이 pd.get_dummies가 알 수 없는 것을 처리할 수 있다는 것에 감사할 수 있도록 Carl의 예를 조금 확장하겠습니다.아래의 두 가지 예는 pd.get_dummies가 OHE로 알 수 없는 처리에서 동일한 작업을 수행할 수 있음을 보여줍니다.

# data is from @dzieciou's comment above
>>> data =pd.DataFrame(pd.Series(['good','bad','worst','good', 'good', 'bad']))
# new_data has two values that data does not have. 
>>> new_data= pd.DataFrame(
pd.Series(['good','bad','worst','good', 'good', 'bad','excellent', 'perfect']))

pd.get_dummies 사용

>>> df = pd.get_dummies(data)
>>> col_list = df.columns.tolist()
>>> print(df)
   0_bad  0_good  0_worst
0      0       1        0
1      1       0        0
2      0       0        1
3      0       1        0
4      0       1        0
5      1       0        0
6      0       0        0
7      0       0        0

>>> new_df = pd.get_dummies(new_data)
# handle unknow by using .reindex and .fillna()
>>> new_df = new_df.reindex(columns=col_list).fillna(0.00)
>>> print(new_df)
#    0_bad  0_good  0_worst
# 0      0       1        0
# 1      1       0        0
# 2      0       0        1
# 3      0       1        0
# 4      0       1        0
# 5      1       0        0
# 6      0       0        0
# 7      0       0        0

단일 핫 인코더 사용

>>> encoder = OneHotEncoder(handle_unknown="ignore", sparse=False)
>>> encoder.fit(data)
>>> encoder.transform(new_data)
# array([[0., 1., 0.],
#        [1., 0., 0.],
#        [0., 0., 1.],
#        [0., 1., 0.],
#        [0., 1., 0.],
#        [1., 0., 0.],
#        [0., 0., 0.],
#        [0., 0., 0.]])

결과 get_memies에서 열을 col_list 변수로 캐시하거나 저장한 다음 pd.reindex를 사용하여 트레인 데이터 세트와 테스트 데이터 세트를 정렬하면 어떨까요?예:

df = pd.get_dummies(data)
col_list = df.columns.tolist()

new_df = pd.get_dummies(new_data)
new_df = new_df.reindex(columns=col_list).fillna(0.00) 

이 질문은 오래 전에 제기되었지만 2023년에도 여전히 관련이 있습니다.

한 문장으로:둘 다 작업에 사용할 수 있으며, 개인적인 선호도 및 기타 상황에 따라 선택할 수 있습니다.

좀 더 자세히 설명해 드리겠습니다.

  • OneHotEncoder와 get_dummies 모두 범주를 명시적으로 지정하는 것이 가능하고 가장 강력한 방법입니다.OneHotEncoder의 경우 목록인 "categories" 매개 변수를 사용하여 이 작업을 수행할 수 있습니다.get_dummies의 경우 관련 열을 적절한 범주와 함께 범주형으로 변환해야 합니다.

  • OneHotEncoder는 데이터의 모든 열을 인코딩하려는 것으로 가정하므로, 그렇지 않은 경우 수동으로 열을 선택/변환/원본 열과 결합하거나 열 변환기로 OneHotEncoder를 감싸야 합니다.get_dummies를 사용하는 것이 훨씬 쉽습니다.

  • 데이터 처리 파이프라인 동안 데이터 프레임 공간에 머무르려면 pandas.get_dummies가 가장 직접적인 방법이지만 skikit Pipeline-s에 의존한다면 열 변압기에 싸인 OneHotEncoder가 더 간단합니다.

예제와 함께 자세한 설명은 데이터 과학에 대한기사를 참조하십시오.

언급URL : https://stackoverflow.com/questions/36631163/what-are-the-pros-and-cons-between-get-dummies-pandas-and-onehotencoder-sciki

반응형