2016-06-27 2 views
0

나는 임의의 숲에서 나무를 어떻게 해석 할 수 있는지 알아 내려고합니다. 내 데이터에는 약 29,000 개의 관측치와 35 개의 관측점이 있습니다. 첫 번째 22 가지 관찰, 처음 11 가지 기능은 물론 예측할 기능 (HighLowMobility)을 붙여 넣었습니다. 여기파이썬을 통해 무작위 포리스트의 나무를 해석하는 방법

birthcohort countyfipscode county_name cty_pop2000 statename state_id stateabbrv perm_res_p25_kr24 perm_res_p75_kr24 perm_res_p25_c1823 perm_res_p75_c1823 HighLowMobility 
1980 1001 Autauga 43671 Alabama 1 AL 45.2994 60.7061   Low 
1981 1001 Autauga 43671 Alabama 1 AL 42.6184 63.2107 29.7232 75.266 Low 
1982 1001 Autauga 43671 Alabama 1 AL 48.2699 62.3438 38.0642 72.2544 Low 
1983 1001 Autauga 43671 Alabama 1 AL 42.6337 56.4204 38.2588 80.4664 Low 
1984 1001 Autauga 43671 Alabama 1 AL 44.0163 62.2799 38.1238 73.747 Low 
1985 1001 Autauga 43671 Alabama 1 AL 45.7178 61.3187 40.9339 83.0661 Low 
1986 1001 Autauga 43671 Alabama 1 AL 47.9204 59.6553 47.4841 72.491 Low 
1987 1001 Autauga 43671 Alabama 1 AL 48.3108 54.042 53.199 84.5379 Low 
1988 1001 Autauga 43671 Alabama 1 AL 47.9855 59.42 52.8927 85.2844 Low 
1980 1003 Baldwin 140415 Alabama 1 AL 42.4611 51.4142   Low 
1981 1003 Baldwin 140415 Alabama 1 AL 43.0029 55.1014 35.5923 76.9857 Low 
1982 1003 Baldwin 140415 Alabama 1 AL 46.2496 56.0045 38.679 77.038 Low 
1983 1003 Baldwin 140415 Alabama 1 AL 44.3001 54.5173 38.7106 81.0388 Low 
1984 1003 Baldwin 140415 Alabama 1 AL 46.4349 55.5245 42.4422 80.3047 Low 
1985 1003 Baldwin 140415 Alabama 1 AL 47.1544 52.8189 42.7994 79.0835 Low 
1986 1003 Baldwin 140415 Alabama 1 AL 47.553 54.934 42.0653 78.4398 Low 
1987 1003 Baldwin 140415 Alabama 1 AL 48.9752 54.3541 39.96 79.4915 Low 
1988 1003 Baldwin 140415 Alabama 1 AL 48.6887 55.3087 43.8557 79.387 Low 
1980 1005 Barbour 29038 Alabama 1 AL     Low 
1981 1005 Barbour 29038 Alabama 1 AL 37.5338 54.3618 34.8771 75.1904 Low 
1982 1005 Barbour 29038 Alabama 1 AL 37.028 57.2471 36.5392 90.3262 Low 
1983 1005 Barbour 29038 Alabama 1 AL     Low 

내 임의 숲입니다 :

#loading the data into data frame 
    X = pd.read_csv('raw_data_for_edits.csv') 
    #Impute the missing values with median values,. 
    X = X.fillna(X.median()) 

    #Dropping the categorical values 
    X = X.drop(['county_name','statename','stateabbrv'],axis=1) 

    #Collect the output in y variable 
    y = X['HighLowMobility'] 


    X = X.drop(['HighLowMobility'],axis=1) 


from sklearn.preprocessing import LabelEncoder 

#Encoding the output labels 
def preprocess_labels(y): 
    yp = [] 
    #low = 0 
    #high = 0 
    for i in range(len(y)): 
     if (str(y[i]) =='Low'): 
     yp.append(0) 
     #low +=1 
    elif (str(y[i]) =='High'): 
     yp.append(1) 
     #high +=1 
     else: 
     yp.append(1) 
     return yp 



    #y = LabelEncoder().fit_transform(y) 
    yp = preprocess_labels(y) 
    yp = np.array(yp) 
    yp.shape 
    X.shape 
    from sklearn.cross_validation import train_test_split 
    X_train, X_test,y_train, y_test = train_test_split(X,yp,test_size=0.25, random_state=42) 
    X_train = np.array(X_train) 
    y_train = np.array(y_train) 
    X_test = np.array(X_test) 
    y_test = np.array(y_test) 
    training_data = X_train,y_train 
    test_data = X_test,y_test 
    dims = X_train.shape[1] 
    if __name__ == '__main__': 
    nn = Neural_Network([dims,10,5,1], learning_rate=1, C=1, opt=False, check_gradients=True, batch_size=200, epochs=100) 
    nn.fit(X_train,y_train) 
    weights = nn.final_weights() 
    testlabels_out = nn.predict(X_test) 
    print testlabels_out 
    print "Neural Net Accuracy is " + str(np.round(nn.score(X_test,y_test),2)) 


    ''' 
    RANDOM FOREST AND LOGISTIC REGRESSION 
    ''' 
    from sklearn import cross_validation 
    from sklearn.linear_model import LogisticRegression 
    from sklearn.ensemble import RandomForestClassifier 
    clf1 = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0,  fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None) 
    clf2 = RandomForestClassifier(n_estimators=100, max_depth=None,min_samples_split=1, random_state=0) 
    for clf, label in zip([clf1, clf2], ['Logistic Regression', 'Random Forest']): 
    scores = cross_validation.cross_val_score(clf, X, y, cv=5, scoring='accuracy') 
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label)) 

가 어떻게 내 나무를 해석 할 것인가? 예를 들어, perm_res_p25_c1823은 25 번째 백분위 수 출생 자녀의 18-23 세 학생의 출석률을 나타내며, perm_res_p75_c1823은 75 번째 백분위 수를 나타내며 HighLowMobility 기능은 높은 또는 낮은 상승 소득 이동성을 나타냅니다. 그러면 다음과 같이 표시됩니다. "사람이 25 번째 백분위 수에서 온 것이고 Alabama, Alabama에 거주한다면 그들은 아마도 낮은 상향 이동성을가집니다"?

+0

여기에 25 % 백분위 수는 무엇입니까? 나는 이것이 모든 대학 출석자 (18-23 세)의 25 %에 해당하는 숫자 일 뿐이라고 생각합니다. 그러나 당신이 그것을 말하는 방식 ("그 사람이 25 번째 백분위 수에서 왔을 때")은 다른 것입니다. – Evert

답변

2

임의의 포리스트가 이러한 방식으로 작동하지 않기 때문에 이러한 조건으로 RF를 실제로 해석 할 수 없습니다. 그것은 다양한 결정 규칙을 가질 수있는 매우 무작위로 구성된 나무의 앙상블을 만듭니다. 일단 해석이 가능한 의사 결정 트리에서 RF로 이동하면 분류 자의 이러한 측면이 느슨해집니다. RF는 검은 색 상자입니다. 여러 가지 약점과 추측을 할 수 있지만 RF를 무시하거나 대체 할 수는 있습니다.

+0

교수님이 RF에서 나무를 해석하길 원한다고하셨습니다. 그는 구체적으로 말하길 "짧은 나무는 '소득 괄호 X에서 살고 Y에 살면 아마도 더 높거나 낮은 상향 이동성을 가질 것"이라고 같은 문구로 변환 될 수 있습니다. " – M3105

+0

단일 나무 예. hundread no의 숲 (x %의 나무 같은 규칙을 말할 수 있습니다) – lejlot

+0

그래, 고마워, 내가 생각했던거야. 나는 그것이 하나의 나무가 아닌 포레스트라는 점을 감안할 때 혼란 스러웠습니다. 어떻게하면 "나무의 x %에 그러한 규칙이 있습니까?"또는 파이썬을 통한 일종의 시각화를 결정할 수 있습니까? 지금까지는 알고리즘의 예측 정확도가 직관적 인 것에서 만 멀었습니다. – M3105