Issue
I have been looking at the Scikit library documentation and example codes. Many of the plots does not have markers in the legends, leaving us to guess everything.
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay
# we create two clusters of random points
n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(
n_samples=[n_samples_1, n_samples_2],
centers=centers,
cluster_std=clusters_std,
random_state=0,
shuffle=False,
)
# fit the model and get the separating hyperplane
clf = svm.SVC(kernel="linear", C=1.0)
clf.fit(X, y)
# fit the model and get the separating hyperplane using weighted classes
wclf = svm.SVC(kernel="linear", class_weight={1: 10})
wclf.fit(X, y)
# plot the samples
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k")
# plot the decision functions for both classifiers
ax = plt.gca()
disp = DecisionBoundaryDisplay.from_estimator(
clf,
X,
plot_method="contour",
colors="k",
levels=[0],
alpha=0.5,
linestyles=["-"],
ax=ax,
)
# plot decision boundary and margins for weighted classes
wdisp = DecisionBoundaryDisplay.from_estimator(
wclf,
X,
plot_method="contour",
colors="r",
levels=[0],
alpha=0.5,
linestyles=["-"],
ax=ax,
)
plt.legend(
[disp.surface_.collections[0], wdisp.surface_.collections[0]],
["non weighted", "weighted"],
loc="upper right",
)
plt.show()
Present plot: In the below plot legend, only text is present, no markers.
Solution
- In a standard plot,
label='weighted'
might be specified;ax.scatter(..., label='weighted')
, and the label is displayed withax.legend()
. - However,
DecisionBoundaryDisplay
is aplot_method="contour"
, which doesn't accept thelabel
parameter.The following kwargs were not used by contour: 'label'
- As such, create a custom label handle, as per How to manually create a legend
from matplotlib.lines import Line2D
# as per the duplicate, create a proper line handle
# disp.surface_.collections[0] and wdisp.surface_.collections[0] are not colored handles
plt.legend(
[Line2D([0], [0], color='k'), Line2D([0], [0], color='r')],
["non weighted", "weighted"],
loc="upper right",
)
# or
plt.legend(
[Line2D([0], [0], color=c) for c in ['k', 'r']],
["non weighted", "weighted"],
loc="upper right",
)
Answered By - Trenton McKinney
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.