【问题标题】:How to interpret trees from random forest via python如何通过python解释随机森林中的树
【发布时间】:2016-10-28 21:46:55
【问题描述】:

我试图弄清楚如何从我的随机森林中解释我的树。我的数据包含大约 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 个百分位并且居住在阿拉巴马州的 Autauga,那么他们的向上流动性可能会更低”?

【问题讨论】:

  • 这里的 25% 是多少?我认为这只是相当于所有大学在校生(18-23 岁)的 25% 的数字,但你表达它的方式(“如果这个人来自第 25 个百分位”),那就不同了。

标签: python machine-learning random-forest


【解决方案1】:

您无法在这些条款中真正解释RF,因为随机森林不这样做。它创造了树木的高度随机组合,可以具有各种决策规则。一旦您从决策树到完全解释的树木到RF,您就会松开分类器的这一方面。 rfs是黑色框。您可以执行许多不同的近似型和估算,但它们将有效地忽略/替换RF。

【讨论】:

  • 我的教授说他希望我从rf解释树木。他具体说“如果该人来自收入支架X并且在Y中生活,则可以将短树转换成”,然后他们可能会有更大/降低的向上移动性“ span>
  • 单个树是。亨德德的森林没有(你可以在x%的树上说出一些规则) span>
  • 好的,谢谢,这就是我在想的。我很困惑,因为这不是一个树的森林。如何能够在“x%的树中有这样的规则”或其他规则中的怎么能确定可能是通过python的某种可视化?到目前为止,我只有远离直观 span>的算法的预测准确性
  • @ M3105部分预测图(部分依赖性图)可以与该端的非参数学习方法一起使用。 span>
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 2013-02-06
  • 2015-09-29
  • 2013-04-26
  • 1970-01-01
  • 2015-10-26
  • 2020-03-30
  • 2016-10-08
相关资源
最近更新 更多