diff --git a/docs/Python-API.rst b/docs/Python-API.rst index dade8a6be5be..3719badfef43 100644 --- a/docs/Python-API.rst +++ b/docs/Python-API.rst @@ -62,6 +62,8 @@ Plotting .. autofunction:: lightgbm.plot_importance +.. autofunction:: lightgbm.plot_split_value_histogram + .. autofunction:: lightgbm.plot_metric .. autofunction:: lightgbm.plot_tree diff --git a/examples/python-guide/README.md b/examples/python-guide/README.md index 60a838a102f9..87fe10413b1c 100644 --- a/examples/python-guide/README.md +++ b/examples/python-guide/README.md @@ -57,5 +57,6 @@ Examples include: - Train and record eval results for further plotting - Plot metrics recorded during training - Plot feature importances + - Plot split value histogram - Plot one specified tree - Plot one specified tree with Graphviz diff --git a/examples/python-guide/notebooks/interactive_plot_example.ipynb b/examples/python-guide/notebooks/interactive_plot_example.ipynb index e472404d9aa4..e5de9821d572 100644 --- a/examples/python-guide/notebooks/interactive_plot_example.ipynb +++ b/examples/python-guide/notebooks/interactive_plot_example.ipynb @@ -187,7 +187,7 @@ "data": { "image/png": "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\n+vTpp1tajVCIExEREa90vBBXXl5e5XpTp06lQYMGVbZ59NFHOffcc8+oPndTiBMRERGvNHr0aNav\nX0/Hjh3p1q0bffv2ZejQobRu3RqASy65hC5dutCmTRvGjh17eL2UlBRyc3PZtGkTrVq14qabbqJN\nmzacd955lJSUADBixAgmTZp0uP1DDz1E586dadeuHatWrQIgJyeHgQMH0qZNG/74xz+SnJxMbm5u\njR2/QpyIiIh4pccff5y0tDSWLFnCf/7zHxYtWsSzzz7LmjVrAHjjjTdYuHAhCxYs4LnnniMvL+83\n21i7di233XYbK1asoEGDBnz00UfH3FdsbCyLFi3illtu4amnngLgkUceYcCAAaxYsYJhw4axZcsW\n9x3sMWiIERERETljj3y2gp+3/1Kt22zdOIKHLmpz0u27d+9+xDAezz33HJMnTwZg69atrF27lpiY\nmCPWSU1NpWPHjgB06dKFTZs2HXPbl1122eE2H3/8MQCzZ88+vP1BgwYRFRV10rVWB4U4ERERqRNC\nQ0MPf87KymL69OnMmTOHkJAQMjMzjznMR2Bg4OHPvr6+h2+nHq+dr6/vCZ+5qykKcSIiInLGTuWK\nWXUJDw9n7969x1xWWFhIVFQUISEhrFq1irlz51b7/vv06cOECRO4//77+eqrr9izZ0+176MqCnEi\nIiLilWJiYujTpw9t27YlODiYhg0bHl42aNAgxowZQ6tWrcjIyKBnz57Vvv+HHnqIq6++mnHjxtGr\nVy8SEhIIDw+v9v0cj0KciIiIeK3333//mPMDAwP54osvjrns0HNvsbGxLF++/PD8v/zlL4c/v/XW\nW79pD9C1a1eysrIAiIyMZNq0afj5+TFnzhzmz59/xO1Zd1OIExERETkNW7Zs4corr6SiooKAgABe\nffXVGt2/QpyIiIjIaUhPT2fx4sUe27/GiRMRERHxQm4NccaYQcaY1caYdcaY0cdYnmmMKTTGLHFN\nD57suiIiIiL1mdtupxpjfIEXgYFANjDfGPOptfbno5p+Z6298DTXFREREamX3Hklrjuwzlq7wVpb\nBowHLq6BdUVERETqPHeGuERga6Xv2a55R+ttjFlmjPnCGHNopMCTXVdERESkXvJ079RFQFNrbZEx\nZggwBUg/lQ0YY0YCIwHi4uIOj90i3qWoqEjnzovp/HkvnTvv5unzFxkZedw3JtRGjRo1YseOHezY\n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\ncBTEtSSjLBiKPwMff2eYFd8AZwqJdq7gRTdzhkrxrX3/XIQF+jlj2cWHHXP5L6UH2JTr3KZdt7uI\n9buLWZdTxMxVu494fVllfj6Gxg2CaRIdTJOoEJpEhxy+ZdswwhlWJTzQT50wpFaoff9ViojImTPm\n19uzXf9/e/ceW+dd33H8/fW5+lx8jZPYubdNU1rUpqVUbelQGGijg1Fg0lq2DkSFGNMY0G1Chf2B\npmlSEQiNP9hQVRhMVFRbuVXj1g0ILTDaQJu2NJfe0lydOPH1+Phyju3v/vg9jo8d27k69uN8XtKj\n55znPOfxz/mpyae/6z0h1JWOwvE9cHzvyXNLz7Mw8GxY7Hi8Eg6fmP6suiQ0bQiLI09OtJicdNGw\ndtHWwDudhmyKa9c2ce3apmnXxyec0kiVgeExBkaq4Rgeo6dc4VDvEAd7Q6ve/+4+xonByinPrU8l\nWN2Y5fK2AltWF7hyVZErVxW5rC1PJrk4y8XIpUkhTkTkUmA2tZjx5W85efn/Ztu2aWIcBrtCS97k\n0bsPul+BA7+ePv4umYUVm6MlUraGyRqrroFU/cX5vc5Bos5oyqVpyqVPe+9QJXTZHhsYpas0wrGB\nEboGRjnSP8xLxwbZvneqVS9RZ6xrrqcjGuvX0VTPmubwujmXpqE+SUN9ikI6qdm2ckEoxImIyHR1\nianAt3HGwiHuMBhNqOh+GU68BF27Ye8P4ZlvhHssEcbdrX0DrL0J1t0ErZuXbIvdfHLpZLSm3exd\ntpWxCfadKLP3WIkXj5Z4rbvMkb5hHn/pOF2lUXyWXlszKGaStBYyrG8Jky/Wt+bZ2JpjQ2ueNU31\n1KfVoienpxAnIiJnzgyKq8Ox8bap6+5hBm3nTjiyM0yu2PU9ePo/wufZRlhzY9iarON66NganhFz\n6WQdW1YX2bK6CNdN/2xyIeQj/cP0DVVOdt/2D1cZGK5yYrDC/p4yT+/vpTQ6faZtY31q2vIpKxuy\nNOdSNNanaIrOjfVpBkad6viElla5RCnEiYjI+TML+8Q2rYPX/XG4NjERWusOPQUHn4JDO+DnnwWi\n5qnC6hDm2reGCRT5FVOLGedXhIkWMVa7EPJ8JhdF3t8zxP7uMkf6wozbowPh/MKRAU4Mjs79gJ/9\nkGImSWMuRXMuTVMuRUs+TUs+TWs+TUs+Q0s+XC9kkuHIhnMmWadJGjGmECciIgujri4sQtx2JVx/\n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\nBtbu0ZtIhz15zUL5hntD1/KsLITYy7bBXQ9dwD+wQCFORERElpZMES5/y2KXIpjco7fnlTDOr/uV\nsD+v1YXwWd8ydc4UQyCs1K4TWA578i6ABQ1xZvZ24ItAAnjQ3e+f8fkdwD8BE8AY8Al3/0X02b3A\nhwjtoM8DH3T3kYUsr4iIiMg0tXv0brxtsUszzYJ11JpZAvgScDtwNfA+M5u51PVPgOvcfStwD/Bg\n9N01wMeAG9399YQQeNdClVVEREQkbhZyesdNwMvu/qq7V4CHgTtqb3D3QXefHHGYZ/rowyRQb2ZJ\nIAccWcCyioiIiMTKQoa4NcDBmveHomvTmNl7zGwP8H1Caxzufhj4PHAA6AT63f2xBSyriIiISKws\n+sQGd/8O8B0zezNhfNzbzKyZ0Gq3CegD/svM7nb3b8z8vpl9GPgwQFtbG9u3b79oZZcLZ3BwUHUX\nY6q/+FLdxZvq79K2kCHuMFA7HWNtdG1W7v64mV1mZiuAtwD73P04gJl9G7gVOCXEufsDwAMAW7Zs\n8VO2H5FY2D7b1jESG6q/+FLdxZvq79K2kN2pO4DNZrbJzNKEiQmP1t5gZleYmUWvbwAyQDehG/Vm\nM8tFn78V2L2AZRURERGJlQVriXP3MTP7KPBjwuzSr7r7C2b2kejzLwN/ArzfzKrAMHBnNNHhSTN7\nBHiasPTIM0StbSIiIiKywGPi3P0HwA9mXPtyzevPAp+d47ufAT6zkOUTERERiaultYOsiIiIiJwR\nhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExER\nEYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKI\nExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGR\nGFKIExEREYkhhTgRERGRGFKIExEREYkhhTgRERGRGFKIExEREYkhc/fFLsMFY2YlYO9il0POyQrg\nxGIXQs6Z6i++VHfxpvqLty3uXjzXLycvZEmWgL3ufuNiF0LOnpn9RnUXX6q/+FLdxZvqL97M7Dfn\n8311p4qIiIjEkEKciIiISAwttxD3wGIXQM6Z6i7eVH/xpbqLN9VfvJ1X/S2riQ0iIiIil4rl1hIn\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -239,7 +239,7 @@ "data": { "image/png": "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\nwUAtSZIklWCgliRJkkowUEuSJEklGKglSZKkEgzUkiRJUgkGakmSJKkEA7UkSZJUgoFakiRJKsFA\nLUmSJJVgoJYkSZJKMFBLkiRJJRioJUmSpBIM1JIkSVIJBmpJkiSpBAO1JEmSVEJLowvYHms71zNq\n9m2NLkNVZo1bx/FN3pOOOUfUPPbTn/408+fPZ9iwYTz00EOv2Td37lxOP/10Vq5cyZAhQ7q7TEmS\n1MvUbYY6Ik6JiIcj4oaIuCciXomI0zcbc3hELI2IRyNidr1qkbrq+OOPZ8GCBX+wfdmyZSxcuJCR\nI0c2oCpJktSM6rnk42SgDTgJOAW4uHpnRPQB/i8wDRgLHBcRY+tYj1SzQw45hMGDB//B9tNOO40L\nL7yQiGhAVZIkqRnVJVBHxOXAaOB7wPTM/CnQudmwdwOPZuZjmfkq8E3gqHrUI3WHm2++mT333JMJ\nEyY0uhRJktRE6rKGOjNPjIjDgamZ+cxWhu0JLKt6vhyYvLVzRsRMYCbAkCFDOXvcuu4qV91g9/6V\nddTNrL29vUvjn3rqKdasWUN7ezsvv/wys2fP5qKLLtr0/O6772bXXXetT7HdYPXq1V1+zao/+9J8\n7Elzsi/Nx55sXa+5KTEzrwCuABg5eq+cu6TXlL5DmDVuHc3ek47prV0b39HBgAEDaG1tZcmSJTz7\n7LN89rOfBeCZZ57hc5/7HPfeey977LFHHaotr729ndbW1kaXoc3Yl+ZjT5qTfWk+9mTrGpmAngDe\nXvV8RLFNajrjxo3j6aef3vR81KhRLFq0yHf5kCRJDX0f6p8Ce0fEOyPiTcDHgVsaWI+0yXHHHcd7\n3vMeli5dyogRI7jqqqsaXZIkSWpSdZ+hjog9gEXAW4ANEXEqMDYzX4iIzwL/AfQBrs7Mn9dyzv59\n+7C0C+8prPprb2/v8pKKZnbddde97v6Ojo6eKUSSJDW9ugXqzBxV9XTEVsbcDtxerxokSZKkevOj\nxyVJkqQSDNSSJElSCQZqSZIkqQQDtSRJklSCgVqSJEkqwUAtSZIklWCgliRJkkowUEuSJEklGKgl\nSZKkEgzUkiRJUgkGakmSJKkEA7UkSZJUgoFakiRJKsFALUmSJJVgoJYkSZJKMFBLkiRJJRioJUmS\npBIM1JIkSVIJBmpJkiSpBAO1JEmSVIKBWpIkSSrBQC1JkiSVYKCWJEmSSjBQS5IkSSUYqCVJkqQS\n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\npQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -257,6 +257,52 @@ " render_plot_importance(importance_type='split')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot split value histogram" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def render_histogram(feature):\n", + " ax = lgb.plot_split_value_histogram(gbm, feature=feature,\n", + " bins='auto', figsize=(10, 5))\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "if INTERACTIVE:\n", + " # create widget for interactive split value histogram\n", + " interact(render_histogram,\n", + " feature=gbm.feature_name())\n", + "else:\n", + " render_histogram(feature='f26')" + ] + }, { "cell_type": "markdown", "metadata": { diff --git a/examples/python-guide/plot_example.py b/examples/python-guide/plot_example.py index 664a1543006f..75412a3c5a4f 100644 --- a/examples/python-guide/plot_example.py +++ b/examples/python-guide/plot_example.py @@ -50,6 +50,10 @@ ax = lgb.plot_importance(gbm, max_num_features=10) plt.show() +print('Plotting split value histogram...') +ax = lgb.plot_split_value_histogram(gbm, feature='f26', bins='auto') +plt.show() + print('Plotting 54th tree...') # one tree use categorical feature to split ax = lgb.plot_tree(gbm, tree_index=53, figsize=(15, 15), show_info=['split_gain']) plt.show() diff --git a/python-package/lightgbm/__init__.py b/python-package/lightgbm/__init__.py index c03ef41ae415..75a4db5c848d 100644 --- a/python-package/lightgbm/__init__.py +++ b/python-package/lightgbm/__init__.py @@ -19,7 +19,8 @@ except ImportError: pass try: - from .plotting import plot_importance, plot_metric, plot_tree, create_tree_digraph + from .plotting import (plot_importance, plot_split_value_histogram, plot_metric, + plot_tree, create_tree_digraph) except ImportError: pass @@ -34,7 +35,7 @@ 'train', 'cv', 'LGBMModel', 'LGBMRegressor', 'LGBMClassifier', 'LGBMRanker', 'print_evaluation', 'record_evaluation', 'reset_parameter', 'early_stopping', - 'plot_importance', 'plot_metric', 'plot_tree', 'create_tree_digraph'] + 'plot_importance', 'plot_split_value_histogram', 'plot_metric', 'plot_tree', 'create_tree_digraph'] # REMOVEME: remove warning after 2.3.0 version release if system() == 'Darwin': diff --git a/python-package/lightgbm/plotting.py b/python-package/lightgbm/plotting.py index 2b9e431eda9a..94abfca4b7a8 100644 --- a/python-package/lightgbm/plotting.py +++ b/python-package/lightgbm/plotting.py @@ -141,6 +141,110 @@ def plot_importance(booster, ax=None, height=0.2, return ax +def plot_split_value_histogram(booster, feature, bins=None, ax=None, width_coef=0.8, + xlim=None, ylim=None, + title='Split value histogram for feature with @index/name@ @feature@', + xlabel='Feature split value', ylabel='Count', + figsize=None, grid=True, **kwargs): + """Plot split value histogram for the specified feature of the model. + + Parameters + ---------- + booster : Booster or LGBMModel + Booster or LGBMModel instance of which feature split value histogram should be plotted. + feature : int or string + The feature name or index the histogram is plotted for. + If int, interpreted as index. + If string, interpreted as name. + bins : int, string or None, optional (default=None) + The maximum number of bins. + If None, the number of bins equals number of unique split values. + If string, it should be one from the list of the supported values by ``numpy.histogram()`` function. + ax : matplotlib.axes.Axes or None, optional (default=None) + Target axes instance. + If None, new figure and axes will be created. + width_coef : float, optional (default=0.8) + Coefficient for histogram bar width. + xlim : tuple of 2 elements or None, optional (default=None) + Tuple passed to ``ax.xlim()``. + ylim : tuple of 2 elements or None, optional (default=None) + Tuple passed to ``ax.ylim()``. + title : string or None, optional (default="Split value histogram for feature with @index/name@ @feature@") + Axes title. + If None, title is disabled. + @feature@ placeholder can be used, and it will be replaced with the value of ``feature`` parameter. + @index/name@ placeholder can be used, + and it will be replaced with ``index`` word in case of ``int`` type ``feature`` parameter + or ``name`` word in case of ``string`` type ``feature`` parameter. + xlabel : string or None, optional (default="Feature split value") + X-axis title label. + If None, title is disabled. + ylabel : string or None, optional (default="Count") + Y-axis title label. + If None, title is disabled. + figsize : tuple of 2 elements or None, optional (default=None) + Figure size. + grid : bool, optional (default=True) + Whether to add a grid for axes. + **kwargs + Other parameters passed to ``ax.bar()``. + + Returns + ------- + ax : matplotlib.axes.Axes + The plot with specified model's feature split value histogram. + """ + if MATPLOTLIB_INSTALLED: + import matplotlib.pyplot as plt + from matplotlib.ticker import MaxNLocator + else: + raise ImportError('You must install matplotlib to plot split value histogram.') + + if isinstance(booster, LGBMModel): + booster = booster.booster_ + elif not isinstance(booster, Booster): + raise TypeError('booster must be Booster or LGBMModel.') + + hist, bins = booster.get_split_value_histogram(feature=feature, bins=bins, xgboost_style=False) + if np.count_nonzero(hist) == 0: + raise ValueError('Cannot plot split value histogram, ' + 'because feature {} was not used in splitting'.format(feature)) + width = width_coef * (bins[1] - bins[0]) + centred = (bins[:-1] + bins[1:]) / 2 + + if ax is None: + if figsize is not None: + _check_not_tuple_of_2_elements(figsize, 'figsize') + _, ax = plt.subplots(1, 1, figsize=figsize) + + ax.bar(centred, hist, align='center', width=width, **kwargs) + + if xlim is not None: + _check_not_tuple_of_2_elements(xlim, 'xlim') + else: + range_result = bins[-1] - bins[0] + xlim = (bins[0] - range_result * 0.2, bins[-1] + range_result * 0.2) + ax.set_xlim(xlim) + + ax.yaxis.set_major_locator(MaxNLocator(integer=True)) + if ylim is not None: + _check_not_tuple_of_2_elements(ylim, 'ylim') + else: + ylim = (0, max(hist) * 1.1) + ax.set_ylim(ylim) + + if title is not None: + title = title.replace('@feature@', str(feature)) + title = title.replace('@index/name@', ('name' if isinstance(feature, string_type) else 'index')) + ax.set_title(title) + if xlabel is not None: + ax.set_xlabel(xlabel) + if ylabel is not None: + ax.set_ylabel(ylabel) + ax.grid(grid) + return ax + + def plot_metric(booster, metric=None, dataset_names=None, ax=None, xlim=None, ylim=None, title='Metric during training', diff --git a/tests/python_package_test/test_plotting.py b/tests/python_package_test/test_plotting.py index 05a25e64d4a2..2093589bea19 100644 --- a/tests/python_package_test/test_plotting.py +++ b/tests/python_package_test/test_plotting.py @@ -60,6 +60,45 @@ def test_plot_importance(self): self.assertTupleEqual(ax2.patches[2].get_facecolor(), (0, .5, 0, 1.)) # g self.assertTupleEqual(ax2.patches[3].get_facecolor(), (0, 0, 1., 1.)) # b + @unittest.skipIf(not MATPLOTLIB_INSTALLED, 'matplotlib is not installed') + def test_plot_split_value_histogram(self): + gbm0 = lgb.train(self.params, self.train_data, num_boost_round=10) + ax0 = lgb.plot_split_value_histogram(gbm0, 27) + self.assertIsInstance(ax0, matplotlib.axes.Axes) + self.assertEqual(ax0.get_title(), 'Split value histogram for feature with index 27') + self.assertEqual(ax0.get_xlabel(), 'Feature split value') + self.assertEqual(ax0.get_ylabel(), 'Count') + self.assertLessEqual(len(ax0.patches), 2) + + gbm1 = lgb.LGBMClassifier(n_estimators=10, num_leaves=3, silent=True) + gbm1.fit(self.X_train, self.y_train) + + ax1 = lgb.plot_split_value_histogram(gbm1, gbm1.booster_.feature_name()[27], figsize=(10, 5), + title='Histogram for feature @index/name@ @feature@', + xlabel='x', ylabel='y', color='r') + self.assertIsInstance(ax1, matplotlib.axes.Axes) + self.assertEqual(ax1.get_title(), + 'Histogram for feature name {}'.format(gbm1.booster_.feature_name()[27])) + self.assertEqual(ax1.get_xlabel(), 'x') + self.assertEqual(ax1.get_ylabel(), 'y') + self.assertLessEqual(len(ax1.patches), 2) + for patch in ax1.patches: + self.assertTupleEqual(patch.get_facecolor(), (1., 0, 0, 1.)) # red + + ax2 = lgb.plot_split_value_histogram(gbm0, 27, bins=10, color=['r', 'y', 'g', 'b'], + title=None, xlabel=None, ylabel=None) + self.assertIsInstance(ax2, matplotlib.axes.Axes) + self.assertEqual(ax2.get_title(), '') + self.assertEqual(ax2.get_xlabel(), '') + self.assertEqual(ax2.get_ylabel(), '') + self.assertEqual(len(ax2.patches), 10) + self.assertTupleEqual(ax2.patches[0].get_facecolor(), (1., 0, 0, 1.)) # r + self.assertTupleEqual(ax2.patches[1].get_facecolor(), (.75, .75, 0, 1.)) # y + self.assertTupleEqual(ax2.patches[2].get_facecolor(), (0, .5, 0, 1.)) # g + self.assertTupleEqual(ax2.patches[3].get_facecolor(), (0, 0, 1., 1.)) # b + + self.assertRaises(ValueError, lgb.plot_split_value_histogram, gbm0, 0) # was not used in splitting + @unittest.skipIf(not MATPLOTLIB_INSTALLED or not GRAPHVIZ_INSTALLED, 'matplotlib or graphviz is not installed') def test_plot_tree(self): gbm = lgb.LGBMClassifier(n_estimators=10, num_leaves=3, silent=True)