python数据挖掘毕设_【python数据挖掘课程】十六.逻辑回归LogisticRegression分析鸢尾花数据...

3. 逻辑回归分析

从图中可以看出,数据集线性可分的,可以划分为3类,分别对应三种类型的鸢尾花,下面采用逻辑回归对其进行分类预测。前面使用X=[x[0] for x in DD]获取第一列数据,Y=[x[1] for x in DD]获取第二列数据,这里采用另一种方法,iris.data[:, :2]获取其中两列数据(两个特征),完整代码如下:

import matplotlib.pyplot as plt

import numpy as np

from sklearn.datasets import load_iris

from sklearn.linear_model import LogisticRegression

#载入数据集

iris = load_iris()

X = X = iris.data[:, :2] #获取花卉两列数据集

Y = iris.target

#逻辑回归模型

lr = LogisticRegression(C=1e5)

lr.fit(X,Y)

#meshgrid函数生成两个网格矩阵

h = .02

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5

y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5

xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

#pcolormesh函数将xx,yy两个网格矩阵和对应的预测结果Z绘制在图片上

Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.figure(1, figsize=(8,6))

plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

#绘制散点图

plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')

plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor')

plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica')

plt.xlabel('Sepal length')

plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())

plt.ylim(yy.min(), yy.max())

plt.xticks(())

plt.yticks(())

plt.legend(loc=2)

plt.show()

下面作者对导入数据集后的代码进行详细讲解。

lr = LogisticRegression(C=1e5)

lr.fit(X,Y)

初始化逻辑回归模型并进行训练,

C=1e5

表示目标函数。

x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

获取的鸢尾花两列数据,对应为花萼长度和花萼宽度,每个点的坐标就是

(x,y)

。 先取

X

二维数组的第一列(长度)的最小值、最大值和步长

h

(设置为

0.02

)生成数组,再取

X

二维数组的第二列(宽度)的最小值、最大值和步长

h

生成数组, 最后用

meshgrid

函数生成两个网格矩阵

xx

yy

,如下所示:

[[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

...,

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]]

[[ 1.5 1.5 1.5 ..., 1.5 1.5 1.5 ]

[ 1.52 1.52 1.52 ..., 1.52 1.52 1.52]

...,

[ 4.88 4.88 4.88 ..., 4.88 4.88 4.88]

[ 4.9 4.9 4.9 ..., 4.9 4.9 4.9 ]]

Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])调用ravel()函数将xx和yy的两个矩阵转变成一维数组,由于两个矩阵大小相等,因此两个一维数组大小也相等。np.c_[xx.ravel(), yy.ravel()]是获取矩阵,即:

xx.ravel()

[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]

yy.ravel()

[ 1.5 1.5 1.5 ..., 4.9 4.9 4.9]

np.c_[xx.ravel(), yy.ravel()]

[[ 3.8 1.5 ]

[ 3.82 1.5 ]

[ 3.84 1.5 ]

...,

[ 8.36 4.9 ]

[ 8.38 4.9 ]

[ 8.4 4.9 ]]

总结下:上述操作是把第一列花萼长度数据按h取等分作为行,并复制多行得到xx网格矩阵;再把第二列花萼宽度数据按h取等分,作为列,并复制多列得到yy网格矩阵;最后将xx和yy矩阵都变成两个一维数组,调用np.c_[]函数组合成一个二维数组进行预测。调用predict()函数进行预测,预测结果赋值给Z。即:

Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

[1 1 1 ..., 2 2 2]

size: 39501

Z = Z.reshape(xx.shape)调用reshape()函数修改形状,将其Z转换为两个特征(长度和宽度),则39501个数据转换为171*231的矩阵。Z = Z.reshape(xx.shape)输出如下:

[[1 1 1 ..., 2 2 2]

[1 1 1 ..., 2 2 2]

[0 1 1 ..., 2 2 2]

...,

[0 0 0 ..., 2 2 2]

[0 0 0 ..., 2 2 2]

[0 0 0 ..., 2 2 2]]

plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)调用pcolormesh()函数将xx、yy两个网格矩阵和对应的预测结果Z绘制在图片上,可以发现输出为三个颜色区块,分布表示分类的三类区域。cmap=plt.cm.Paired表示绘图样式选择Paired主题。输出的区域如下图所示:

20170910111416353

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值