Skip to content

Instantly share code, notes, and snippets.

@Polegar22
Last active April 16, 2018 22:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Polegar22/f9019bf80803758a6b1323217d31a99a to your computer and use it in GitHub Desktop.
Save Polegar22/f9019bf80803758a6b1323217d31a99a to your computer and use it in GitHub Desktop.
fastai/courses/ml1/FeatureImportanceScratch.ipynb
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "%load_ext autoreload\n%autoreload 2",
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": "The autoreload extension is already loaded. To reload it, use:\n %reload_ext autoreload\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "%matplotlib inline\n\nfrom fastai.imports import *\nfrom fastai.structured import *\nfrom sklearn.ensemble import RandomForestRegressor, RandomForestClassifier\nfrom IPython.display import display\nfrom sklearn import metrics\nfrom numpy import array\nfrom numpy import reshape",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "class TreeEnsemble():\n def __init__(self, x, y, n_trees, sample_sz, min_leaf=5):\n np.random.seed(42)\n self.x,self.y,self.sample_sz,self.min_leaf = x,y,sample_sz,min_leaf\n self.trees = [self.create_tree() for i in range(n_trees)]\n\n def create_tree(self):\n idxs = np.random.permutation(len(self.y))[:self.sample_sz]\n return DecisionTree(self.x.iloc[idxs], self.y[idxs], \n idxs=np.array(range(self.sample_sz)), min_leaf=self.min_leaf)\n \n def predict(self, x):\n return np.mean([t.predict(x) for t in self.trees], axis=0)\n\ndef std_agg(cnt, s1, s2): return math.sqrt((s2/cnt) - (s1/cnt)**2)",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "class DecisionTree():\n def __init__(self, x, y, idxs, min_leaf=5):\n self.x,self.y,self.idxs,self.min_leaf = x,y,idxs,min_leaf\n self.n,self.c = len(idxs), x.shape[1]\n self.val = np.mean(y[idxs])\n self.score = float('inf')\n self.find_varsplit()\n \n def find_varsplit(self):\n for i in range(self.c): self.find_better_split(i)\n if self.score == float('inf'): return\n x = self.split_col\n lhs = np.nonzero(x<=self.split)[0]\n rhs = np.nonzero(x>self.split)[0]\n self.lhs = DecisionTree(self.x, self.y, self.idxs[lhs])\n self.rhs = DecisionTree(self.x, self.y, self.idxs[rhs])\n\n def find_better_split(self, var_idx):\n x,y = self.x.values[self.idxs,var_idx], self.y[self.idxs]\n sort_idx = np.argsort(x)\n sort_y,sort_x = y[sort_idx], x[sort_idx]\n rhs_cnt,rhs_sum,rhs_sum2 = self.n, sort_y.sum(), (sort_y**2).sum()\n lhs_cnt,lhs_sum,lhs_sum2 = 0,0.,0.\n\n for i in range(0,self.n-self.min_leaf-1):\n xi,yi = sort_x[i],sort_y[i]\n lhs_cnt += 1; rhs_cnt -= 1\n lhs_sum += yi; rhs_sum -= yi\n lhs_sum2 += yi**2; rhs_sum2 -= yi**2\n if i<self.min_leaf or xi==sort_x[i+1]:\n continue\n\n lhs_std = std_agg(lhs_cnt, lhs_sum, lhs_sum2)\n rhs_std = std_agg(rhs_cnt, rhs_sum, rhs_sum2)\n curr_score = lhs_std*lhs_cnt + rhs_std*rhs_cnt\n if curr_score<self.score: \n self.var_idx,self.score,self.split = var_idx,curr_score,xi\n\n @property\n def split_name(self): return self.x.columns[self.var_idx]\n \n @property\n def split_col(self): return self.x.values[self.idxs,self.var_idx]\n\n @property\n def is_leaf(self): return self.score == float('inf')\n \n def __repr__(self):\n s = f'n: {self.n}; val:{self.val}'\n if not self.is_leaf:\n s += f'; score:{self.score}; split:{self.split}; var:{self.split_name}'\n return s\n\n def predict(self, x):\n return np.array([self.predict_row(xi) for xi in x])\n\n def predict_row(self, xi):\n if self.is_leaf: return self.val\n t = self.lhs if xi[self.var_idx]<=self.split else self.rhs\n return t.predict_row(xi)",
"execution_count": 9,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Load in our data from last lesson"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "PATH = \"data/bulldozers/\"\n\ndf_raw = pd.read_feather('tmp/bulldozers-raw')\ndf_raw['random'] = np.random.randint(0,10000, size=len(df_raw))\ndf_trn, y_trn, nas = proc_df(df_raw, 'SalePrice')",
"execution_count": 10,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def split_vals(a,n): return a[:n], a[n:]\nn_valid = 12000\nn_trn = len(df_trn)-n_valid\nX_train, X_valid = split_vals(df_trn, n_trn)\ny_train, y_valid = split_vals(y_trn, n_trn)\nraw_train, raw_valid = split_vals(df_raw, n_trn)",
"execution_count": 11,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "cols = ['MachineID', 'YearMade', 'MachineHoursCurrentMeter', 'ProductSize', 'Enclosure',\n 'Coupler_System', 'saleYear', 'random']",
"execution_count": 12,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "tree = TreeEnsemble(X_train[cols], y_train, 5, 1000)\npreds = tree.predict(X_valid[cols].values)",
"execution_count": 13,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Feature importance"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def rmse(x,y): return math.sqrt(((x-y)**2).mean())",
"execution_count": 14,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def shuffle_df_column(df, column):\n shuffled = df.iloc[:,[column]].sample(frac=1)\n shuffled.reset_index(inplace=True, drop=True)\n df.iloc[:,[column]] = shuffled\n return df\n",
"execution_count": 15,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def featureImportance(self, x,y):\n result = pd.DataFrame({'cols':[],'imp':[]})\n benchRmse = rmse(self.predict(x.values), y)\n for colIdx in range(x.shape[1]):\n shuffledRmse = rmse(self.predict(shuffle_df_column(x.copy(), colIdx).values), y)\n fi = np.absolute(benchRmse - shuffledRmse)\n result.loc[result.shape[0]] = [x.columns[colIdx], fi]\n return result.sort_values('imp', ascending=False)\n\n \n",
"execution_count": 16,
"outputs": []
},
{
"metadata": {
"scrolled": false,
"trusted": true
},
"cell_type": "code",
"source": "my_fi = featureImportance(tree, X_valid[cols], y_valid);",
"execution_count": 17,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def plot_fi(fi): return fi.plot('cols', 'imp', 'barh', figsize=(12,7), legend=False)",
"execution_count": 18,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "plot_fi(my_fi[:10]);",
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 864x504 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#sklearn results"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "m = RandomForestRegressor(n_estimators=5, bootstrap=False)\nm.fit(X_train[cols], y_train)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "fi = rf_feat_importance(m, X_valid[cols]); plot_fi(fi[:10])",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Redondant values => copied from notebook lesson2"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from scipy.cluster import hierarchy as hc",
"execution_count": 20,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df_keep = X_train[cols]",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "corr = np.round(scipy.stats.spearmanr(df_keep).correlation, 4)\ncorr_condensed = hc.distance.squareform(1-corr)\nz = hc.linkage(corr_condensed, method='average')\nfig = plt.figure(figsize=(8,5))\ndendrogram = hc.dendrogram(z, labels=df_keep.columns, orientation='left', leaf_font_size=16)\nplt.show()",
"execution_count": 22,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 576x360 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Partial dependence"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import collections",
"execution_count": 23,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def partialDependenceOfFeature(self, x, feature):\n xCopy = x.copy()\n result = {}\n for value in x[feature].unique():\n xCopy[feature] = value\n result[value] = self.predict(xCopy.values)\n return collections.OrderedDict(sorted(result.items())):\n ",
"execution_count": 24,
"outputs": []
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "pdYm = partialDependenceOfFeature(tree, X_valid[cols], 'YearMade')",
"execution_count": 56,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "del pdYm[1000]",
"execution_count": 57,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "preds, features =zip(*((x, k) for k in pdYm for x in pdYm[k]))",
"execution_count": 58,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "plt.plot(features,preds)",
"execution_count": 81,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 81,
"data": {
"text/plain": "[<matplotlib.lines.Line2D at 0x2b1309b1240>]"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "meanByYear = {k:np.sum(v)/len(pdYm[k]) for k,v in pdYm.items()}",
"execution_count": 82,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "x, y = zip(*meanByYear.items())\nplt.plot(x,y)",
"execution_count": 80,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 80,
"data": {
"text/plain": "[<matplotlib.lines.Line2D at 0x2b139b3b6a0>]"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"_draft": {
"nbviewer_url": "https://gist.github.com/f9019bf80803758a6b1323217d31a99a"
},
"gist": {
"id": "f9019bf80803758a6b1323217d31a99a",
"data": {
"description": "fastai/courses/ml1/RfFromScratch.ipynb",
"public": true
}
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.5",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment