# Using a random forest to valuate features

Gist code

Even you don’t wish to use a random forest regressor for predictions you can still use it to get an idea of how the features contribute. Below is an example based on the bike-sharing data.

import sys
import csv

import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn import preprocessing
from sklearn.metrics import mean_squared_error, explained_variance_score
from sklearn.utils import shuffle
import matplotlib.pyplot as plt

%matplotlib inline

def plot_feature_importances(feature_importances, title, feature_names):
# Normalize the importance values
feature_importances = 100.0 * (feature_importances / max(feature_importances))

# Sort the values and flip them
index_sorted = np.flipud(np.argsort(feature_importances))

# Arrange the X ticks
pos = np.arange(index_sorted.shape) + 0.5

# Plot the bar graph
plt.figure()
plt.bar(pos, feature_importances[index_sorted], align='center')
plt.xticks(pos, feature_names[index_sorted])
plt.ylabel('Relative Importance')
plt.title(title)
plt.show()

X, y = [], []
X.append(row[2:13])
y.append(row[-1])

# Extract feature names
feature_names = np.array(X)

# Remove the first row because they are feature names
return np.array(X[1:]).astype(np.float32), np.array(y[1:]).astype(np.float32), feature_names

if __name__=='__main__':
# Load the dataset from the input file
X, y = shuffle(X, y, random_state=7)

# Split the data 80/20 (80% for training, 20% for testing)
num_training = int(0.9 * len(X))
X_train, y_train = X[:num_training], y[:num_training]
X_test, y_test = X[num_training:], y[num_training:]

# Fit Random Forest regression model
rf_regressor = RandomForestRegressor(n_estimators=1000, max_depth=10, min_samples_split=3)
rf_regressor.fit(X_train, y_train)

# Evaluate performance of Random Forest regressor
y_pred = rf_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
evs = explained_variance_score(y_test, y_pred)

print(("MSE =", round(mse, 2)))
print(("Explained variance score =", round(evs, 2)))

# Plot relative feature importances
plot_feature_importances(rf_regressor.feature_importances_, 'Random Forest regressor', feature_names) Tags: