scikit_learn 모델에서 fit과 fit_transform의 차이점은 무엇입니까?


110

저는 데이터 과학 에 익숙 하지 않으며 scikit-learn의 방법 fit과 차이점을 이해하지 못합니다 fit_transform. 왜 우리가 왜 데이터를 변환해야하는지 설명 할 수 있습니까?

훈련 데이터에 모델을 맞추고 테스트 데이터로 변환하는 것은 무엇을 의미합니까? 예를 들어 범주 형 변수를 학습에서 숫자로 변환하고 데이터를 테스트하기 위해 새 기능 세트를 변환하는 것을 의미합니까?



@sds 위의 답변은이 질문에 대한 링크를 제공합니다.
Kaushal28

우리는 적용 fit상의 training dataset와 사용 transform방법에 both- 훈련 데이터 집합 및 테스트 데이터 세트
프라 카쉬 쿠마

답변:


117

데이터중앙에 맞추 려면 (평균과 단위 표준 오차가 0이되도록) 평균을 빼고 결과를 표준 편차로 나눕니다.

x=xμσ

훈련 데이터 세트에서이를 수행합니다. 그러나 테스트 세트 (예 : 교차 검증) 또는 예측 전에 새로 얻은 예제에 동일한 변환을 적용해야합니다. 그러나 훈련 세트를 중앙에 배치하는 데 사용한 것과 동일한 두 개의 매개 변수 및 (값)를 사용해야합니다.σμσ

따라서 모든 sklearn의 변환 fit()은 매개 변수 (예 : StandardScaler의 경우 및 를 계산하여 내부 객체 상태로 저장합니다. 그런 다음 메소드를 호출 하여 특정 예제 세트에 변환을 적용 할 수 있습니다 .σμσtransform()

fit_transform()는이 두 단계를 결합하고 훈련 세트 에서 매개 변수의 초기 피팅에 사용 되지만 변환 된 도 반환합니다 . 내부적으로는 먼저 호출 한 다음 동일한 데이터 를 호출 합니다.x 'xxfit()transform()


1
답을 주셔서 감사합니다. 단 하나만. 모형의 매개 변수로 인해 뛰어난 경사와 회귀에 대한 차단을 의미하지 않습니까? 적합 할 때 어떤 매개 변수가 적합 방법에 적합되는지와 같은 선형 회귀를 가정 해 봅시다. 기울기 및 절편과 같은 정규화 매개 변수 또는 모형 매개 변수?
Kaggle

1
변환 내부의 매개 변수를 의미합니다 ( StandardScaler의 경우 및 ). 변환의 메소드는 무엇이든 반환합니다. 예를 들어 대치 에 관한이 장을 참조하십시오. scikit-learn.org/stable/modules/…σμσget_params()
K3 --- rnc

2
내 이전 의견은 실제로 잘못되었습니다. 선형 회귀의 경우 적합 매개 변수는 coef_반환 된 매개 변수가 아닌 (즉, 기울기와 절편)입니다 get_params()(대신 연관된 값과 함께 모델 생성자 인수 집합을 반환합니다).
K3 --- rnc

좋은 답변입니다! 이 주제를 검색하는 동안 귀하의 게시물을 발견했지만 명확히해야합니다. fit_transform()그것은 우리가 후속 예제의 각 세트를 변환하기를 원한다면 내부 데이터 상태에 액세스 할 수 없으므로 fit()초기 데이터 세트에서 얻은 것과 동일한 매개 변수로 후속 예제를 변환하기 위해 호출해서는 안된다는 것을 의미 합니까? 예를 들어, 테스트 데이터 세트가 있고 테스트 세트를 변형 된 학습자에게 전달하도록 변환하려는 경우에 발생합니다.
AKKA

당신이 전화를 한 후 t.fit_transform(train_data), t 되어 장착, 그래서 당신은 안전하게 사용할 수 있습니다 t.transform(test_data).
K3 --- rnc

10

다음 설명을 기반으로 fit_transformImputer클래스,하지만 아이디어는 동일하다 fit_transform다른 scikit_learn 클래스 등 MinMaxScaler.


transform결 측값을 숫자로 바꿉니다. 기본적으로이 숫자는 선택한 일부 데이터 열의 평균입니다. 다음 예제를 고려하십시오.

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

이제 imputer는 첫 번째 열에 평균 (1 + 8) / 2 = 4.5를 사용하고 두 번째 열에 2 열 데이터에 적용 할 때 평균 (2 + 3 + 5.5) / 3 = 3.5를 사용하는 방법을 배웠습니다.

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

우리는 얻는다

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

따라서 fitimputer는 일부 데이터에서 열 평균을 계산하고 transform누락 된 값을 평균으로 대체하는 일부 데이터에 해당 평균을 적용합니다. 이 두 데이터가 동일하면 (즉, 평균 계산 데이터와 평균이 적용되는 데이터) fit_transform기본적으로 fit뒤에 오는을 사용할 수 있습니다 transform.

이제 당신의 질문 :

왜 데이터를 변환해야합니까?

"다양한 이유로 인해 많은 실제 데이터 세트에는 종종 공백, NaN 또는 기타 자리 표시 자로 인코딩 된 결 측값이 포함되어 있습니다. 그러나 이러한 데이터 세트는 배열의 모든 값이 숫자라고 가정하는 scikit-learn 추정기와 호환되지 않습니다."( source )

훈련 데이터에 모델을 맞추고 테스트 데이터로 변환하는 것은 무엇을 의미합니까?

fitimputer의은과 아무 상관이 없습니다 fit피팅 모델에 사용합니다. 따라서 fit훈련 데이터에 imputer를 사용하면 각 훈련 데이터 열의 평균을 계산할 수 있습니다. transform테스트 데이터를 사용하면 테스트 데이터의 결 측값이 교육 데이터에서 계산 된 수단으로 대체됩니다.


3

평신도의 관점에서 fit_transform은 일부 계산을 수행 한 다음 변환을 수행함을 의미합니다 (일부 데이터에서 열의 평균을 계산 한 다음 결 측값 대체). 따라서 훈련 세트의 경우 변환을 계산하고 수행해야합니다.

그러나 테스트 세트의 경우 머신 러닝은 트레이닝 세트에서 학습 한 내용을 기반으로 예측을 적용하므로 계산할 필요가 없으며 변환 만 수행합니다.


3

이 방법은 scikit-learn의 데이터 세트 변환에 사용됩니다.

데이터 세트의 스케일링 값에 대한 예를 보자.

여기서 적합 방법은 훈련 데이터 세트에 적용될 때 모형 매개 변수 (예 : 평균 및 표준 편차)를 학습합니다. 그런 다음 훈련 된 데이터 세트에 변환 방법 을 적용하여 변형 된 (스케일 된) 훈련 데이터 세트를 얻습니다. 훈련 데이터 세트에 fit_transform 을 적용 하여이 단계를 한 단계로 수행 할 수도 있습니다 .

그렇다면 왜 우리는 적합변환이라는 두 가지 방법이 필요 합니까?

실제로 우리는 별도의 훈련 및 테스트 데이터 세트를 가져야하며, 별도의 맞춤변환 방법이 도움이됩니다. 우리 는 훈련 데이터 세트에 적합 을 적용 하고 훈련 데이터 세트와 테스트 데이터 세트 모두 에서 변환 방법을 사용합니다 . 따라서 훈련 및 시험 데이터 세트는 적합 법 적용 훈련 데이터 세트 를 적용 할 때 학습 된 모델 파라미터를 사용하여 변환 (스케일링)된다 .

예제 코드 :

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

2

이것은 기술적 답변이 아니지만 직감을 구축하는 데 도움이되기를 바랍니다.

첫째, 모든 견적자는 일부 훈련 데이터에 대해 훈련 (또는 "적합")됩니다. 그 부분은 매우 간단합니다.

두 번째로, 모든 scikit-learn 추정기는 파이프 라인에서 사용될 수 있으며 파이프 라인에 대한 아이디어는 데이터가 파이프 라인을 통해 흐른다는 것입니다 . 파이프 라인의 특정 수준에 맞으면 데이터가 파이프 라인의 다음 단계로 전달되지만 데이터는 어떤 방식 으로든 변경 (변환)되어야합니다. 그렇지 않으면 파이프 라인에서 해당 단계가 전혀 필요하지 않습니다. 따라서 변환은 파이프 라인에서 다음 단계의 요구를 충족시키기 위해 데이터를 변환하는 방법입니다.

파이프 라인을 사용하지 않는 경우, 가장 간단한 분류기조차도 여전히 분류 기능을 수행 하기 때문에 이러한 머신 러닝 도구에 대해 생각하는 것이 도움이된다고 생각 합니다. 일부 데이터를 입력하고 출력을 생성합니다. 이것 역시 파이프 라인입니다. 아주 간단한 것입니다.

요약하면, 착용감 , 트레이닝을 행하는 변환 파이프 라인의 다음 스테이지에게 전달하기 위해 파이프 라인의 변화를 데이터 및 fit_transform는 피팅 한 아마도 최적화 단계의 변형을 모두한다.


""훈련 데이터 세트에 적합을 적용하고 훈련 데이터 세트와 테스트 데이터 세트 모두에 변환 방법을 사용합니다 "":) Nice
Prakash Kumar

2
아래에 의견을 말하려는 것 같습니다. Prasad Nageshkar에 전달하겠습니다. (음 ... 평판이 좋았다면.)
Eric McLachlan

1

변환을 적용하면 예를 들어 두 개의 변수 과 모두 거리를 측정하지만 의 단위가 센티미터이고 의 단위가 킬로미터 인 경우 데이터를 정상적으로 작동 시키려고 합니다. 변환이 비슷한 동작을하거나 정규 분포처럼 동작하는 것처럼 동일한 단위로 변환해야합니다.V1V2V1V2

다른 질문으로 오면 먼저 훈련 세트에서 모델을 작성합니다 (모델은 훈련 세트에서 데이터의 패턴 또는 동작을 학습 함). 테스트 세트에서 동일한 모델을 실행하면 유사한 패턴 또는 동작을 식별하려고 시도합니다. 일단 식별되면 결론을 내리고 그에 따라 훈련 데이터에 따라 결과를 제공합니다


0

데이터를 정규화해야하는 작업을 고려하십시오. 예를 들어 최소-최대 정규화 또는 z- 점수 정규화를 사용할 수 있습니다. 모델에는 몇 가지 고유 매개 변수가 있습니다. 최소-최대 정규화의 최소값 및 최대 값과 z- 점수 정규화의 평균 및 표준 편차입니다. fit () 함수는 이러한 매개 변수의 값을 계산합니다.

fit ()의 효과

변환 함수는 실제 데이터에 매개 변수 값을 적용하고 정규화 된 값을 제공합니다.

transform ()의 효과

fit_transform () 함수는 동일한 단계에서 둘 다 수행합니다.

fit_transform ()의 효과

2 단계에서 수행하든 단일 단계에서 수행하든 동일한 값을 얻습니다.


0

"fit"은 이후 스케일링에 사용되는 평균 및 표준을 계산합니다 . (계산)하지만 아무것도 당신 에게 주어지지 않습니다 .

"변환"은 이전에 계산 된 평균과 표준을 사용하여 데이터를 자동 스케일링합니다 (모든 값에서 평균을 빼고 표준으로 나눕니다).

"fit_transform"은 동시에 둘 다 수행합니다. 따라서 2 대신 1 줄의 코드로 수행 할 수 있습니다.

이제 실제로 살펴 보겠습니다.

를 들어 X 트레이닝 세트 우리는 평균과 표준 계산하고 데이터를 오토 스케일하는 데 사용할 필요가 있기 때문에, 우리는 "fit_transform"를 않습니다. 를 들어 X 테스트 세트 부분을 잘, 우리는 이미 평균과 표준, 그래서 우리는 단지 "변환"않습니다.

매우 간단합니다. 잘하고 있어요 내 친구 좋은 일을 유지 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.