2014-06-17 3 views
8

내가 전에 요청을받은 것 확실 해요,하지만 난 파이썬에 sklearn를 사용하여 로지스틱 회귀를 실행sklearn 로지스틱 회귀 - 중요한 기능

, 나는에 내 데이터 집합을 변환 할 수있어 답을 찾을 수 있어요 변환 방법을 사용하는 가장 중요한 기능

classf = linear_model.LogisticRegression() 
func = classf.fit(Xtrain, ytrain) 
reduced_train = func.transform(Xtrain) 

어떤 기능이 가장 중요하다고 생각하는지 어떻게 알 수 있습니까? 더 일반적으로 데이터 집합의 각 기능의 p- 값을 어떻게 계산합니까?

답변

1

적합 모델의 coef_ 속성에서 계수를보고 가장 중요한 기능을 확인할 수 있습니다. (LogisticRegression의 경우, transform은 절대 값이 가장 큰 계수를 찾고 있습니다.)

대부분의 scikit-learn 모델은 p 값을 계산하는 방법을 제공하지 않습니다. 대체로 말하자면,이 모델은 예측 결과가 실제로 어떻게 예측되는지에 대한 이해를 얻기 위해 검사되지 않고 출력을 예측하는 데 사용되도록 설계되었습니다. p 값에 관심이 있다면 statsmodels을 볼 수 있습니다. sklearn보다 다소 성숙하지는 않습니다.

+2

coefs_ 크기는 기능의 중요성에 대한 척도가 아닙니다. 숫자를 어떻게 봐야 할까? 감사합니다 – mel

+0

@mel : 소스 코드를 보면'LogisticRegression.transform'이 실제로'coef_'를 사용하여 기능의 중요성을 평가하고 있음을 알 수 있습니다. 더 높은 절대 값을 갖는 계수를 더 중요하게 생각합니다. 관련 코드는 [여기] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_selection/from_model.py)입니다. "중요성"에 대한 다른 정의를 원한다면 그 내용을 설명해야합니다. – BrenBarn

+3

실제로 np.abs (coef_)는 기능 중요성을 정량화하는 데있어 끔찍한 시도입니다. 즉, 모델이하지 않는 한 다 변수 설정 (즉, 변수가 공동으로 예측을 수행함)에서 실제로 의미가없는 개념입니다. 변수 선택, 예. 드문 드문. 모델이 희박성을 조장한다면, 당신은 가중치가 0 인 변수를 폐기 할 수 있습니다. 그러나 엄격히 말하자면 기술적으로 모든 것을 할 수 있습니다.일부 다른 모델은'feature_importance'를 노출합니다. 모델에 따라이 기능이 데이터를 얼마나 잘 설명 하는지를 나타내는 단 변량입니다. – eickenberg

3

LogisticRegression.transform은 유지할 기능을 결정하는 threshold 값을 취합니다. 문단 바로부터 :

임계 값 : 문자열, 부동 또는 없음, 선택 사항 (기본값 = 없음) 기능 선택에 사용할 임계 값입니다. 중요도가 더 큰 기능은 유지되고 다른 기능은 무시됩니다. 은 삭제됩니다. "중앙값"("평균값") 인 경우 임계 값은 기능 가져 오기 값의 중간 값 (평균값)이 입니다. 스케일링 팩터 (예 : "1.25 * 평균")가 사용될 수도 있습니다. 없음 인 경우 을 사용할 수있는 경우 개체 특성 threshold이 사용됩니다. 그렇지 않은 경우 "평균"이 기본적으로 사용됩니다.

LR 평가기에 객체 속성 threshold이 없으므로 평균보다 높은 절대 값 (클래스를 합친 후의)이 기본적으로 유지됩니다.

1

위의 설명에서 제안한 것처럼 적합성을 비교하기 전에 데이터를 스케일링 할 수 있고 계수를 비교할 수 있습니다. 다음은 이것이 어떻게 작동 하는지를 보여주는 약간의 코드입니다. 비교를 위해 this 형식을 따릅니다.

import numpy as np  
from sklearn.linear_model import LogisticRegression 
from sklearn.preprocessing import StandardScaler 
import pandas as pd 
import matplotlib.pyplot as plt 

x1 = np.random.randn(100) 
x2 = np.random.randn(100) 
x3 = np.random.randn(100) 

#Make difference in feature dependance 
y = (3 + x1 + 2*x2 + 5*x3 + 0.2*np.random.randn()) > 0 

X = pd.DataFrame({'x1':x1,'x2':x2,'x3':x3}) 

#Scale your data 
scaler = StandardScaler() 
scaler.fit(X) 
X_scaled = pd.DataFrame(scaler.transform(X),columns = X.columns) 

clf = LogisticRegression(random_state = 0) 
clf.fit(X_scaled, y) 

feature_importance = abs(clf.coef_[0]) 
feature_importance = 100.0 * (feature_importance/feature_importance.max()) 
sorted_idx = np.argsort(feature_importance) 
pos = np.arange(sorted_idx.shape[0]) + .5 

featfig = plt.figure() 
featax = featfig.add_subplot(1, 1, 1) 
featax.barh(pos, feature_importance[sorted_idx], align='center') 
featax.set_yticks(pos) 
featax.set_yticklabels(np.array(X.columns)[sorted_idx], fontsize=8) 
featax.set_xlabel('Relative Feature Importance') 

plt.tight_layout() 
plt.show() 
+0

간단히하기 위해'StandardScaler' 대신'scale'을 사용할 수도 있습니다 : http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html – istewart