如何使用分类 sklearn boston 住房数据集使用 matplotlib 绘制线性图

Posted

技术标签:

【中文标题】如何使用分类 sklearn boston 住房数据集使用 matplotlib 绘制线性图【英文标题】:How to draw a linear plot with matplotlib using the categorical sklearn boston housing dataset 【发布时间】:2019-05-28 04:51:19 【问题描述】:

我是数据科学的初学者,我正在尝试使用 matplotlib(以及其他包,如 pandas 和 numpy)与 boston 数据集绘制线性图。我被要求从 [0,1] 区间绘制它。我被要求绘制房屋价格(TARGET,这是 y 轴)与该地区的犯罪率(CRIM,这是 x 轴)。我的目标是使用 Matplotlib 的直方图,但我找不到像这样的分类数据集如何做到这一点。到目前为止,这是我拥有的代码:

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_boston

boston = load_boston()

dataFrame_x = pd.DataFrame(boston.data, columns = boston.feature_names)
dataFrame_y = pd.DataFrame(boston.target)

dataFrame_x.describe()

这是数据描述(在 SO 上看起来太糟糕了。对此我深表歉意):

    CRIM    ZN  INDUS   CHAS    NOX RM  AGE DIS RAD TAX PTRATIO B   LSTAT
count   506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000
mean    3.613524    11.363636   11.136779   0.069170    0.554695    6.284634    68.574901   3.795043    9.549407    408.237154  18.455534   356.674032  12.653063
std 8.601545    23.322453   6.860353    0.253994    0.115878    0.702617    28.148861   2.105710    8.707259    168.537116  2.164946    91.294864   7.141062
min 0.006320    0.000000    0.460000    0.000000    0.385000    3.561000    2.900000    1.129600    1.000000    187.000000  12.600000   0.320000    1.730000
25% 0.082045    0.000000    5.190000    0.000000    0.449000    5.885500    45.025000   2.100175    4.000000    279.000000  17.400000   375.377500  6.950000
50% 0.256510    0.000000    9.690000    0.000000    0.538000    6.208500    77.500000   3.207450    5.000000    330.000000  19.050000   391.440000  11.360000
75% 3.677083    12.500000   18.100000   0.000000    0.624000    6.623500    94.075000   5.188425    24.000000   666.000000  20.200000   396.225000  16.955000
max 88.976200   100.000000  27.740000   1.000000    0.871000    8.780000    100.000000  12.126500   24.000000   711.000000  22.000000   396.900000  37.970000

【问题讨论】:

您需要向读者提供更多详细信息。您要针对哪一列绘制哪一列。您预期的直方图应该是什么样子?数据集中有很多列。如果你不告诉他们,读者怎么知道要绘制什么? 我知道有很多栏目。这就是我所说的。我从未绘制过分类数据集。我只选择 2 列来绘制吗? 由于您正在使用数据集,因此您应该知道要绘制和可视化什么。您在这个项目背后的具体意图是什么? 这不是一个真正的项目。我被要求用数据集创建一个简单的图。 “带有数据集的简单绘图”这个术语太模糊了。我建议通过波士顿数据集相关网站了解您应该绘制的内容。 【参考方案1】:

根据我对您的 cmets 的理解,以下是对数据执行线性拟合的方法。由于您想针对区域 0 到 1 绘制 CRIMTarget,因此您使用索引从 DataFrame 中获取 CRIM 值,然后对这些值执行线性回归。

xdata = dataFrame_x['CRIM'][dataFrame_x['CRIM'] < 1].values
ydata = dataFrame_y[dataFrame_x['CRIM'] < 1].values.flatten()

xmesh = np.linspace(min(xdata), max(xdata), 50)

fit = np.poly1d(np.polyfit(xdata, ydata, 1))

plt.plot(xdata, ydata, 'bo', label='Data')
plt.plot(xmesh, fit(xmesh), '-b', label='Fit')
plt.legend(fontsize=16)
plt.xlabel('CRIM', fontsize=18)
plt.ylabel('Target',fontsize=18)

【讨论】:

非常感谢。我已接受并赞成您的回答。如果您认为这是一个很好的问题,您能否也给我一个赞成票? 我做到了。谢谢。很高兴为您提供帮助【参考方案2】:

您正在尝试绘制两个连续变量。因此,散点图或类似的可视化可以最好地解释关系。在这里,我试图绘制散点图的六边形分箱。您可以使用以下documentation 尝试其他版本。显示的单个变量直方图处于极端情况。

import seaborn as sns

filter_cdtn = dataFrame_x['CRIM'] < 1

sns.jointplot(x=dataFrame_x.loc[filter_cdtn,'CRIM'], 
              y=boston.target[filter_cdtn], 
              kind="hex").set_axis_labels("CRIM", "Target")
plt.show()

【讨论】:

问题。 1、filter_cdtn = dataFrame_x['CRIM'] &lt; 1的用途是什么,为什么小于1? 2.如果filter_cdtn代表CRIM,那么y=boston.target[filter_cdtn]是什么意思? 1.既然你在你的问题draw it from the [0,1] interval 中提到过,我已经根据这个条件过滤了记录。 2. 同样的记录过滤也适用于y。如果您不需要,您可以删除 filter_cdtn。

以上是关于如何使用分类 sklearn boston 住房数据集使用 matplotlib 绘制线性图的主要内容,如果未能解决你的问题,请参考以下文章

sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)

sklearn.datasets

Tensorflow 多元线性回归结果为 NaN

线性回归 预测Boston房价

scikit-learn内置数据集

如何使用 sklearn 管道跟踪 catboost 的分类索引