Gráfico de importancia de la característica de bosque aleatorio usando Python

Estoy trabajando con RandomForestRegressor en python y quiero crear un gráfico que ilustrará el ranking de importancia de las características. Este es el código que utilicé:

from sklearn.ensemble import RandomForestRegressor MT= pd.read_csv("MT_reduced.csv") df = MT.reset_index(drop = False) columns2 = df.columns.tolist() # Filter the columns to remove ones we don't want. columns2 = [c for c in columns2 if c not in["Violent_crime_rate","Change_Property_crime_rate","State","Year"]] # Store the variable we'll be predicting on. target = "Property_crime_rate" # Let's randomly split our data with 80% as the train set and 20% as the test set: # Generate the training set. Set random_state to be able to replicate results. train2 = df.sample(frac=0.8, random_state=1) #exclude all obs with matching index test2 = df.loc[~df.index.isin(train2.index)] print(train2.shape) #need to have same number of features only difference should be obs print(test2.shape) # Initialize the model with some parameters. model = RandomForestRegressor(n_estimators=100, min_samples_leaf=8, random_state=1) #n_estimators= number of trees in forrest #min_samples_leaf= min number of samples at each leaf # Fit the model to the data. model.fit(train2[columns2], train2[target]) # Make predictions. predictions_rf = model.predict(test2[columns2]) # Compute the error. mean_squared_error(predictions_rf, test2[target])#650.4928 

Importancia de la característica

 features=df.columns[[3,4,6,8,9,10]] importances = model.feature_importances_ indices = np.argsort(importances) plt.figure(1) plt.title('Feature Importances') plt.barh(range(len(indices)), importances[indices], color='b', align='center') plt.yticks(range(len(indices)), features[indices]) plt.xlabel('Relative Importance') 

Este código de importancia de la función se modificó de un ejemplo que se encuentra en http://www.agcross.com/2015/02/random-forests-in-python-with-scikit-learn/

Recibo el siguiente error cuando bash replicar el código con mis datos:

  IndexError: index 6 is out of bounds for axis 1 with size 6 

Además, solo una característica aparece en mi gráfico con un 100% de importancia donde no hay tags.

Cualquier ayuda para resolver este problema para que pueda crear este gráfico será muy apreciada.

    Aquí hay un ejemplo usando el conjunto de datos del iris.

     >>> from sklearn.datasets import load_iris >>> iris = load_iris() >>> rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42) >>> rnd_clf.fit(iris["data"], iris["target"]) >>> for name, importance in zip(iris["feature_names"], rnd_clf.feature_importances_): ... print(name, "=", importance) sepal length (cm) = 0.112492250999 sepal width (cm) = 0.0231192882825 petal length (cm) = 0.441030464364 petal width (cm) = 0.423357996355 

    Importancia de la función de trazado

     >>> features = iris['feature_names'] >>> importances = rnd_clf.feature_importances_ >>> indices = np.argsort(importances) >>> plt.title('Feature Importances') >>> plt.barh(range(len(indices)), importances[indices], color='b', align='center') >>> plt.yticks(range(len(indices)), [features[i] for i in indices]) >>> plt.xlabel('Relative Importance') >>> plt.show() 

    Importancia de la característica

    Cargue la importancia de las características en una serie de pandas indexada por sus nombres de columna, luego use su método de trazado. por ejemplo, para un modelo de clasificador / regresor de RF sklearn entrenado usando df :

     feat_importances = pd.Series(model.feature_importances_, index=df.columns) feat_importances.nlargest(4).plot(kind='barh') 

    introduzca la descripción de la imagen aquí

    Las garrapatas y no son correctas. Para arreglarlo, debería ser

     plt.yticks(range(len(indices)), [features[i] for i in indices]) 

    En el código anterior de spies006, “feature_names” no funcionó para mí. Una solución genérica sería utilizar name_of_the_dataframe.columns.

    Este código de spies006 no funciona: plt.yticks(range(len(indices)), features[indices]) por lo que tiene que cambiarlo por plt.yticks(range(len(indices)),features.columns[indices])

    Una gráfica de barras sería más que útil para visualizar la importancia de las características .

    Use esto (ejemplo usando el conjunto de datos Iris):

     from sklearn.ensemble import RandomForestClassifier from sklearn import datasets import numpy as np import matplotlib.pyplot as plt # Load data iris = datasets.load_iris() X = iris.data y = iris.target # Create decision tree classifer object clf = RandomForestClassifier(random_state=0, n_jobs=-1) # Train model model = clf.fit(X, y) # Calculate feature importances importances = model.feature_importances_ # Sort feature importances in descending order indices = np.argsort(importances)[::-1] # Rearrange feature names so they match the sorted feature importances names = [iris.feature_names[i] for i in indices] # Barplot: Add bars plt.bar(range(X.shape[1]), importances[indices]) # Add feature names as x-axis labels plt.xticks(range(X.shape[1]), names, rotation=20, fontsize = 8) # Create plot title plt.title("Feature Importance") # Show plot plt.show() 

    introduzca la descripción de la imagen aquí