数学建模社区-数学中国

标题: 线性回归实例-鸢尾花数据集 [打印本页]

作者: 1047521767    时间: 2021-10-23 20:42
标题: 线性回归实例-鸢尾花数据集
                                       文章目录
' V6 I  p# C! c' B0 h1 w一、具体实现步骤
4 m8 a+ D- H  w$ b& H' z3 ^4 K" |1. 导入Iris鸢尾花数据集: ]1 Q* T1 @2 {% f6 o% k
2. 提取花瓣数据  N8 I9 ~* O3 W! g9 C- A
3. 拆分数据
  i9 \4 ?2 ?) A, P3 j- e4. 训练模型
) O3 f1 L1 L6 i二、可视化结果展示
9 y* x4 d' a! u% |; U! F1. 训练集
) N) e& U/ x9 n6 U6 d2. 测试集
7 y6 Y3 m) K* f$ s" t三、相关知识点讲解
6 h7 o8 Z( S" }7 a7 x1. train_test_split()函数8 B. ?! s$ `. G- w4 U* M
2. LinearRegression()函数! D4 Z: `4 ~% s
3. 散点图与折线统计图的绘制
1 z) X' Q/ ?# c/ {# U- i0 c! n这篇文章中,我们要通过鸢尾花的花瓣长度预测花瓣宽度
1 w% k( R- N/ _. M  ^
$ q) [, k9 p; X2 O

. l( S& J& ?" E! u0 W, V环境:Python3.6.5
, |( V  b7 [4 H* o8 K) S, ]+ A编译器:jupyter notebook( s) u( N+ [1 t9 t2 V. `

+ e9 T. G; _' ~5 y* A一、具体实现步骤
8 L' a/ F4 F0 O3 C( a1. 导入Iris鸢尾花数据集
; P' ]7 N+ C$ V9 M/ ~Iris鸢尾花数据集共有150条记录,分别是:
; `, |$ ~1 c/ J* T; w8 S50条山鸢尾 (Iris-setosa)
) ?! j( E. ]' S- t, V) o7 X50条变色鸢尾(Iris-versicolor)* J# m2 ^; h4 t  m+ z7 [
50条维吉尼亚鸢尾(Iris-virginica)  Y' Z2 E; i6 z1 t# W
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"  
( J! v9 Q6 S6 e- m" f7 dnames = ['花萼-length', '花萼-width', '花瓣-length', '花瓣-width', 'class']  1 N# ~/ f7 M! C) T+ W  r
dataset = pd.read_csv(url, names=names): M; I$ w- V; q+ K& n. Q

2 d" P  s9 M' B, t1 K2. 提取花瓣数据( ]  R1 }  Y6 Z. ]3 Q! G* Q( o! W
下面我们提取数据集中花瓣宽度与花瓣长度数据,将花瓣数据分为训练数据与测试数据,训练数据用于训练线性回归模型,测试数据用于检测我们的模型的准确率。
9 L: O+ R, G, e  h& V: u9 Q1 N; p7 l0 b6 H2 y2 A: X- L8 D

) R0 q8 r1 \; N$ n9 L0 p* _9 m最终我们要达到的效果是:输入花瓣宽度,通过模型预测花瓣宽度。
  s% j' w$ g& F7 v: Z$ N8 g# [2 q# q( Y: N

5 S4 j& \  K' B/ S0 j. D" v. i3 qX = dataset["花瓣-length"]8 U! f% C6 x  Z
Y = dataset["花瓣-width"]
) M' O1 B8 q* ]- ]X = X.reshape(len(X),1)
( [4 |6 ^% o" FY = Y.reshape(len(Y),1)
1 }4 ?1 ?' P# k( p% F4 i5 `/ G9 L# F! ]0 u2 c
3. 拆分数据
" k8 Y- Z! n) E- o将数据集拆分数据集成训练集、测试集* c/ G7 R/ M3 s

5 I' }  j( R, s

( x5 b6 {  }& |8 u( Sfrom sklearn.model_selection import train_test_split
8 @! r; d1 g/ c4 I5 K' dX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)$ L0 f1 W+ s# B- ]7 t  E/ p

- x) j. t3 ~9 R$ S: `, l4. 训练模型' X3 b; @& W5 d( U# D0 Z! L+ X
这里我们需要将我们的训练数据喂给模型进行训练。
* ~/ z' \- g( v' U; W3 o/ P7 s, H% x2 I5 X$ q

& I8 O9 n0 u& F; X0 ]from sklearn.linear_model import LinearRegression
5 e1 a# J0 T4 l8 y# tregressor = LinearRegression()( E8 j$ h$ i& P- L% Z: G8 L
regressor = regressor.fit(X_train, Y_train); c& ^# _) ?- L; m8 E1 \

  Q8 s+ x4 H0 D( z2 D; {+ t7 g二、可视化结果展示
: i& o8 }8 ~% r" d) Q1. 训练集; B( c6 Z: d$ f; c1 k& Z! a2 `1 ~6 S
将训练集中每一朵花的花瓣数据与线性回归模型预测的结果放到同一张统计图中。/ l. n& B0 |! l" D8 `
3 B) H8 [! Z3 s4 N5 C
/ H) K4 I1 B1 u- e. U
import matplotlib.pyplot as plt
9 b9 \/ H, ~; {) S; i' }1 m% Q6 {1 e$ ^4 Z; V/ `/ A

. b0 g" \6 j* O5 q) I4 \" M! ]plt.scatter(X_train, Y_train, color='red')9 F& {5 K3 c, I) X8 {
plt.plot(X_train, regressor.predict(X_train), color='green')
' x- s: |: f; k' ?* Rplt.xlabel("Iris-length")
: X2 Y& R4 S4 C5 ?7 K1 m. O4 oplt.ylabel("Iris-width") * v3 Z* Z5 y! _$ p/ s3 S( S
plt.title("This is train dataset-kzb")/ \2 C# O+ x; g$ z
plt.show()' g$ }/ q  a  B- W8 E& {5 F* V2 k

; J" o  G1 L9 R9 n红色的点是训练数据集中的花瓣数据,我们不难看出花瓣长度与宽度是一个线性关系,绿色的线是我们模型拟合的结果。: v4 A' I! M/ H% W

5 A+ p9 r# U2 N4 r/ Y
, a7 l1 e  o# x+ o7 ]

  V) N) U9 w( q. h0 ?# S2. 测试集
+ {% L0 S; p9 y2 S2 I# `将测试集中每一朵花的花瓣数据与线性回归模型预测的结果放到同一张统计图中。1 e/ _7 ?1 S6 s6 D9 w4 A

! M, L# O5 w. A: n' W
) P) c: X: f; p. T+ P" B
plt.scatter(X_test, Y_test, color='blue')
2 R# V  Y5 h9 K& L1 F2 Q7 bplt.plot(X_train, regressor.predict(X_train), color='green')2 k" \% d9 k- [. J7 B3 t5 s
plt.xlabel("Iris-length")
: f' I* {! y% Uplt.ylabel("Iris-width")
/ ^. p' u9 W% B- @/ @$ Y' Fplt.title("This is test dataset-kzb")% p8 |1 Q4 c' C( T% M
plt.show()
) J" [  X& Z; F7 g) `0 u' B& r6 R. {* j! N
绿色的点是测试数据集中的花瓣数据,我们可以看出这部分数据也是符合线性关系的,随着集的增大,线性关系会更加明显。
" t4 W1 R4 ?/ `* H# y% h) y: p* ?; d& |) p7 S$ E% A( c+ G6 @

( k6 B4 v5 O. E, ]6 B" s5 o. X1 a( b
$ V0 l5 N/ {9 d* t7 w0 k; o
三、相关知识点讲解
( t" q  j8 u) v/ Q- }) H1. train_test_split()函数7 ^5 }' }/ ]( v  n
train_test_split():将数据集划分为测试集与训练集。
0 J3 K! @6 k/ t# V- N: ~+ F: N1 k* R' ~# r( Z0 t5 B+ X* u9 R
! w/ r/ k+ J3 v: s7 H
X:所要划分的整体数据的特征集;
. P! Y( @. s6 N* C4 CY:所要划分的整体数据的结果;% T* i' Q- k( H& g. c0 j
test_size:测试集数据量在整体数据量中的占比(可以理解为X_test与X的比值);
; }1 K1 W& h0 A7 }random_state:①若不填或者填0,每次生成的数据都是随机,可能不一样。②若为整数,每次生成的数据都相同;$ _$ i2 P  Q8 h) `, ^- U2 J" f: e* c
from sklearn.model_selection import train_test_split. J- q, ]! ~% }' M
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)1 l7 K; w5 j( B( F0 B/ Y$ s
- t. {, |# f: `' i6 \
2. LinearRegression()函数
, n% C5 t8 U% o" @8 [+ {0 a, Lsklearn.linear_model包实现了广义线性模型,包括线性回归、Ridge回归、Bayesian回归等。LinearRegression是其中较为简单的线性回归模型。; b% m: w8 ^+ ?3 [+ I+ X  l

* L+ I% Y7 U, O7 l: ~( z1 N5 [' G

. ^  Z1 `4 `. x解释一下什么是回归:回归最简单的定义是,给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归。. K2 A9 H9 k' l' m
( [$ v) [4 g" l% N8 r  |' t3 _
$ j/ @5 V' Y; ]
3. 散点图与折线统计图的绘制
# Y3 T/ I1 k0 A8 k4 F5 rplt.scatter():绘画出数据的散点图
: g  U1 D9 ^& p; D* m) B# G4 r" xplt.plot():绘画出依据模型(LinearRegression的线性回归模型)生成的直线- v* D; ]; ]4 N+ D, G
有问题请加我QQ3243710560
3 i( `; E. D5 ~5 O
+ V4 {, W! X. X7 R  \% Q  K! H- F2 C6 N/ w3 D





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5