热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

运用Isotonic回归算法解决鸢尾花数据集中的回归挑战

本文探讨了利用Isotonic回归算法解决鸢尾花数据集中的回归问题。首先介绍了Isotonic回归的基本原理及其在保持单调性方面的优势,并通过具体示例说明其应用方法。随后详细描述了鸢尾花数据集的特征和获取途径,最后展示了如何将Isotonic回归应用于该数据集,以实现更准确的预测结果。

基于Isotonic回归的鸢尾花数据集回归问题

  • 1. 作者介绍
  • 2.保序回归算法
    • 2.1 算法原理
    • 2.2 保序回归算法举例
  • 3. 鸢尾花数据集介绍
    • 3.1 数据集获取
  • 4.代码实现
      • 4.1 导入需要的包
      • 4.2 下载鸢尾花数据集并输出每个样本特征属性
      • 4.3 利用PCA降维并调用保序回归
      • 4.4 实验结果
      • 4.5 完整代码


1. 作者介绍

刘静,女,西安工程大学电子信息学院,2021级硕士研究生
研究方向:机器视觉与人工智能
电子邮件:2350588223@qq.com

孟莉苹,女,西安工程大学电子信息学院,2021级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:2425613875@qq.com

2.保序回归算法

2.1 算法原理

保序回归是回归算法的一种。保序回归给定一个有限的实数集合 Y=y1,y2,……yn代表观察到的响应,以及X=x1,x2,……xn代表未知的响应值,训练一个模型来最小化下列方程:

在这里插入图片描述

其中x1≤x2≤⋯≤xn ,wi为权重是正值。其结果方程称为保序回归,而且其解是唯一的。它可以被视为有顺序约束下的最小二乘法问题。实际上保序回归在拟合原始数据点时是一个单调函数。我们实现池旁者算法,它使用并行保序回归。训练数据是DataFrame格式,包含标签、特征值以及权重三列。另外保序算法还有一个参数名为isotonic,其默认值为真,它指定保序回归为保序(单调递增)或者反序(单调递减)。

2.2 保序回归算法举例

问题描述:给定一个无序数字序列,要求不改变每个元素的位置,但可以修改每个元素的值,修改后得到一个非递减序列,问如何使误差(该处取平方差)最小?
保序回归法:从该序列的首元素往后观察,一旦出现乱序现象停止该轮观察,从该乱序元素开始逐个吸收元素组成一个序列,直到该序列所有元素的平均值小于或等于下一个待吸收的元素。
举例:
原始序列&#xff1a;<9, 10, 14>
结果序列&#xff1a;<9, 10, 14>
分析&#xff1a;从9往后观察&#xff0c;到最后的元素14都未发现乱序情况&#xff0c;不用处理。
原始序列&#xff1a;<9, 14, 10>
结果序列&#xff1a;<9, 12, 12>
分析&#xff1a;从9往后观察&#xff0c;观察到14时发生乱序&#xff08;14>10&#xff09;&#xff0c;停止该轮观察转入吸收元素处理&#xff0c;吸收元素10后子序列为<14, 10>&#xff0c;取该序列所有元素的平均值得12&#xff0c;故用序列<12, 12>替代<14, 10>。吸收10后已经到了最后的元素&#xff0c;处理操作完成。
原始序列&#xff1a;<14, 9, 10, 15>
结果序列&#xff1a;<11, 11, 11, 15>
分析&#xff1a;从14往后观察&#xff0c;观察到9时发生乱序&#xff08;14>9&#xff09;&#xff0c;停止该轮观察转入吸收元素处理&#xff0c;吸收元素9后子序列为<14, 9>。求该序列所有元素的平均值得12.5&#xff0c;由于12.5大于下个带吸收的元素10&#xff0c;所以再吸收10&#xff0c;得序列<14, 9, 10>。求该序列所有元素的平均值得11&#xff0c;由于11小于下个带吸收的元素15&#xff0c;所以停止吸收操作&#xff0c;用序列<11, 11, 11>替代<14, 9, 10>。

3. 鸢尾花数据集介绍

包含 3 类分别为山鸢尾&#xff08;Iris-setosa&#xff09;、变色鸢尾&#xff08;Iris-versicolor&#xff09;和维吉尼亚鸢尾&#xff08;Iris-virginica&#xff09;&#xff0c;共 150 条数据&#xff0c;每类各 50 个数据&#xff0c;每条记录都有 4 项特征&#xff1a;花萼长度、花萼宽度、花瓣长度、花瓣宽度&#xff0c;通常可以通过这4个特征预测鸢尾花卉属于哪一品种。
在这里插入图片描述

3.1 数据集获取

首先要在自己的Python环境中下载sklearn(进入个人虚拟环境并输入):

pip install scikit-learn

接着就可以输入下面代码&#xff0c;下载数据集&#xff1a;

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

Iris数据集包含在sklearn库当中&#xff0c;具体在sklearn\datasets\data文件夹下&#xff0c;文件名为iris.csv。其数据格式如下&#xff1a;
在这里插入图片描述

4&#xff0e;代码实现

4.1 导入需要的包

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from sklearn.linear_model import LinearRegression
from sklearn.isotonic import IsotonicRegression
import pandas as pd
from sklearn.utils import check_random_state

4.2 下载鸢尾花数据集并输出每个样本特征属性

#然后以字典的形式加载鸢尾花数据集&#xff0c;使用y表示数据集中的标签&#xff0c;使用x表示数据集中的属性数据。
data &#61; load_iris()
y &#61; data.target
x &#61; data.data
np.random.seed(5)
centers &#61; [[1, 1], [-1, -1], [1, -1]] #鸢尾花数据集输出每个样本的特征属性值
tt &#61; pd.DataFrame(data&#61;data.data, columns&#61;data.feature_names) #将数据集数据转换成panda
tt[&#39;species&#39;] &#61; data.target #把鸢尾花类型加入到数据集中
data &#61; tt
data.rename(columns&#61;{&#39;sepal length (cm)&#39;:"萼片长","sepal width (cm)":"萼片宽","petal length (cm)":"花瓣长","petal width (cm)":"花瓣宽","species":"种类"},inplace&#61;True)
kind_dict &#61; {0:"Setosa",1:"Versicolour",2:"Virginica"
}
data["种类"] &#61; data["种类"].map(kind_dict)
data.head()
print(data.head(150))

在这里插入图片描述

4.3 利用PCA降维并调用保序回归

#调用PCA算法进行降维主成分分析
#指定主成分个数&#xff0c;即降维后数据维度&#xff0c;降维后的数据保存在reduced_x中。
pca &#61; PCA(n_components&#61;1)
reduced_x &#61; pca.fit_transform(x)
x &#61; reduced_x.flatten()#Fit IsotonicRegression and LinearRegression models
ir &#61; IsotonicRegression()
y_ &#61; ir.fit_transform(x, y)
lr &#61; LinearRegression()
lr.fit(x[:, np.newaxis], y) # x needs to be 2d for LinearRegression
#Plot result
segments &#61; [[[i, y[i]], [i, y_[i]]] for i in range(150)]
lc &#61; LineCollection(segments, zorder&#61;0)
lc.set_array(np.ones(len(y)))
lc.set_linewidths(np.full(150, 0.5))
fig, (ax0, ax1) &#61; plt.subplots(ncols&#61;2, figsize&#61;(10, 6))
ax0.plot(x, y, &#39;r.&#39;, markersize&#61;12)
ax0.plot(x, y_, &#39;b.-&#39;, markersize&#61;12)
ax0.plot(x, lr.predict(x[:, np.newaxis]), &#39;c-&#39;)
ax0.add_collection(lc)
ax0.legend((&#39;Data&#39;,&#39;Isotonic Fit&#39;,&#39;Linear fit&#39;), loc&#61;&#39;lower right&#39;)
ax0.set_title(&#39;Isotonic regression&#39;)x_test&#61;np.linspace(-10,100,1000)
ax1.plot(x_test,ir.predict(x_test),&#39;b-&#39;)
ax1.plot(ir.X_thresholds_, ir.y_thresholds_, &#39;b.&#39;, markersize&#61;12)
ax1.set_title("Prediction function (%d thresholds)" % len(ir.X_thresholds_))
plt.show()
correct &#61; 0
for i in range(150):if y_[i] < 2 and y_[i] > 1:y[i] &#61; 3if y[i] &#61;&#61; int(y_[i]):correct &#61; correct&#43;1
print(correct/150*100,"%")

4.4 实验结果

在这里插入图片描述

4.5 完整代码

#导入鸢尾花数据集&#xff0c;调用matplotlib包用于数据的可视化&#xff0c;并加载PCA算法包。
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_irisimport numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from sklearn.linear_model import LinearRegression
from sklearn.isotonic import IsotonicRegression
import pandas as pd
from sklearn.utils import check_random_state#然后以字典的形式加载鸢尾花数据集&#xff0c;使用y表示数据集中的标签&#xff0c;使用x表示数据集中的属性数据。
data &#61; load_iris()
y &#61; data.target
x &#61; data.data
np.random.seed(5)
centers &#61; [[1, 1], [-1, -1], [1, -1]] #鸢尾花数据集输出每个样本的特征属性值
tt &#61; pd.DataFrame(data&#61;data.data, columns&#61;data.feature_names) #将数据集数据转换成panda
tt[&#39;species&#39;] &#61; data.target #把鸢尾花类型加入到数据集中
data &#61; tt
data.rename(columns&#61;{&#39;sepal length (cm)&#39;:"萼片长","sepal width (cm)":"萼片宽","petal length (cm)":"花瓣长","petal width (cm)":"花瓣宽","species":"种类"},inplace&#61;True)
kind_dict &#61; {0:"Setosa",1:"Versicolour",2:"Virginica"
}
data["种类"] &#61; data["种类"].map(kind_dict)
data.head()
print(data.head(150))#调用PCA算法进行降维主成分分析
#指定主成分个数&#xff0c;即降维后数据维度&#xff0c;降维后的数据保存在reduced_x中。
pca &#61; PCA(n_components&#61;1)
reduced_x &#61; pca.fit_transform(x)
x &#61; reduced_x.flatten()#Fit IsotonicRegression and LinearRegression models
ir &#61; IsotonicRegression()
y_ &#61; ir.fit_transform(x, y)
lr &#61; LinearRegression()
lr.fit(x[:, np.newaxis], y) # x needs to be 2d for LinearRegression
#Plot result
segments &#61; [[[i, y[i]], [i, y_[i]]] for i in range(150)]
lc &#61; LineCollection(segments, zorder&#61;0)
lc.set_array(np.ones(len(y)))
lc.set_linewidths(np.full(150, 0.5))
fig, (ax0, ax1) &#61; plt.subplots(ncols&#61;2, figsize&#61;(10, 6))
ax0.plot(x, y, &#39;r.&#39;, markersize&#61;12)
ax0.plot(x, y_, &#39;b.-&#39;, markersize&#61;12)
ax0.plot(x, lr.predict(x[:, np.newaxis]), &#39;c-&#39;)
ax0.add_collection(lc)
ax0.legend((&#39;Data&#39;,&#39;Isotonic Fit&#39;,&#39;Linear fit&#39;), loc&#61;&#39;lower right&#39;)
ax0.set_title(&#39;Isotonic regression&#39;)x_test&#61;np.linspace(-10,100,1000)
ax1.plot(x_test,ir.predict(x_test),&#39;b-&#39;)
ax1.plot(ir.X_thresholds_, ir.y_thresholds_, &#39;b.&#39;, markersize&#61;12)
ax1.set_title("Prediction function (%d thresholds)" % len(ir.X_thresholds_))
plt.show()
correct &#61; 0
for i in range(150):if y_[i] < 2 and y_[i] > 1:y[i] &#61; 3if y[i] &#61;&#61; int(y_[i]):correct &#61; correct&#43;1
print(correct/150*100,"%")


推荐阅读
author-avatar
锦瑟刻下两段缠绵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有