* @4 D& A4 X% ?( l7 N9 B#生成506个样本和105个导出特征的房价信息数据集* m) m% f" N% z$ u$ @: a
X, y = mglearn.datasets.load_extended_boston() 9 U7 L2 W j! `8 q! L$ { 5 c- o4 J0 b' w& ~2 h3 k3 _0 Z* z5 G |( d( }3 m
#将数据集拆分为 训练集与测试集7 I% Z2 u4 m2 \& F, I
X_train, X_test, y_train, y_test = train_test_split(X, y)! R! K4 U1 I: d5 a
+ X; S( X3 S: e+ J* Y
/ i" _9 }; P# |! [9 |#使用Ridge模型训练波士顿房价信息数据集 ) _+ c7 J! G/ _: v; }/ Rridge = Ridge().fit(X_train, y_train) 2 Z F3 r, E# L : h0 ^- y6 h- H1 u( O* |* C. J/ ], R1 d: \, ~3 E
print('train score: {}'.format(ridge.score(X_train, y_train))) #预测训练集的准确度4 w% ]$ ^: w n! W" Q( |$ J
print('test score: {}'.format(ridge.score(X_test, y_test))) #预测测试集的准确度 - {( p( j4 t7 M . g k W# ~& w7 S W! Q) p; ~3 f/ E9 n" G' P: y
1+ P9 s* K0 a. \$ F# |5 f
2 ( i8 D7 q9 W5 F* P3" J; t/ F7 h9 N" l; d
4 & d, j" }( J. g5 ( s" n0 ]3 c% \6 - c8 z' Q9 m, T$ k- k. V7 6 i7 V) D7 T( [83 c2 ]( [4 P$ f( q" I1 o5 B6 |
9+ h/ {. n5 q3 Q c( Q. }
10 . r1 H3 F; ~0 s0 X7 q6 v. G" r11 8 C& j7 h( `# Z8 q12! h# @+ h$ p: X3 Y
13 0 b0 k9 J$ s. E8 ?14 " C5 w) b) ]! d15 ) u. a+ ]+ ?0 ~" J16" Y/ ]4 l# I% w5 \ u
17/ t5 i% A. b! _2 S
18& N: o2 k% g8 H7 s" {, `( k
19 9 x$ K, p' F! M4 A* \3 f5 t203 K8 Q8 g7 j7 Y5 Y5 J* [) K
21. Y( w7 H2 f U1 C0 o
运行结果- o/ c1 u* v: E+ ^6 A- n8 F6 o: b
3 K) [ t5 t3 f) [, @9 M% Q5 F
train score: 0.85562482602875915 n1 O q, ?# v2 p" K% r
test score: 0.8605931411425929 ( U! ?+ ^# j3 E5 i, @, D/ S9 Z1 ; e8 ^& @: l( r3 T6 N) d2 : u ~! c0 T1 g/ a. K7 Q1 C此时发现,训练集与测试集的预测结果相近,属于欠拟合的情况,即特征数较少的情况,即特征系数w接近0的情况,属于过度正则。我们可以适当缩减alpha,从而减少正则,增加特征的影响,再次测试。 J! ?2 h& L4 i- m7 W0 N 8 d; K- D! d% bfrom sklearn.linear_model import Ridge" A2 F. i. a8 X1 r' K0 k0 i% g
from sklearn.model_selection import train_test_split( Q$ E6 q5 `$ i# v3 T8 P& O
import matplotlib.pyplot as plt . w# a: ?& O% L" z; C: pimport numpy as np ' O4 j4 O' K' `4 ]# Z5 g$ z ; K# ], @: O! x! j0 H& T; S: x' G- k# V _, k% s# d6 Q4 k
#生成506个样本和105个导出特征的房价信息数据集 ) N4 s1 W4 [9 M1 gX, y = mglearn.datasets.load_extended_boston() " m% Q6 C6 s5 ~ 8 J3 C' E! d4 g/ ^, [3 g9 R: e' K1 O 4 K1 ?! A5 x- R#将数据集拆分为 训练集与测试集# n6 r' L/ J0 ?! T9 J7 p+ M
X_train, X_test, y_train, y_test = train_test_split(X, y) / P( v( l' w6 ~$ H3 q & Z2 v/ q! p2 E+ p4 V, r& j4 F 1 x# i. k( \5 A+ E#默认alpha为1,调整为0.1,减少正则影响 . O7 r" x; N+ g# n& ]6 W- h1 N6 Uridge = Ridge(alpha=0.1).fit(X_train, y_train)! K$ h! g% z, F: A$ o7 a2 A+ u
9 \8 y& h; n2 f+ I( A0 P
" S8 f M* R4 |2 F8 R5 V
print('train score: {}'.format(ridge.score(X_train, y_train))) #预测训练集的准确度% p( m6 q9 {! m0 w
print('test score: {}'.format(ridge.score(X_test, y_test))) #预测测试集的准确度 1 b" W. _+ Z- {$ [( E$ w& \3 j- g, w+ T4 o
) ?- N* c* Q1 ^: q1. j2 s: Y! [9 y3 y9 c
23 V) i: X3 d, S! t" F9 F
3 6 w1 \$ f# ~$ K4" O9 z/ f1 B6 \, _9 C
5( @9 w0 g( [/ A% H$ G m2 }/ t
63 ^' J8 c4 s6 A+ `! ~& b. g5 L
7* y/ r1 r& `2 Q1 [- E* q
8 / w/ O! X7 K# ~9 ) _2 h5 f" I6 l1 A) s8 o10 e$ q/ {5 |& q" y: u! S3 w$ @111 I6 r4 I1 I- T4 l# E4 Y( [& v
12! V+ a) p" q# _4 c
13 % @( X) W0 j% o1 m q14 - |+ ~/ y- G: C8 s; X8 T* b15 " z, d* k; L7 `9 A$ T {16 + h% \* {6 k$ {177 |# ] J( }( u+ G' h& ^. X
18 9 G+ f! [; \# W4 n- t% n: q190 y! B5 V; b) h& y: A' j2 V
20 0 Y8 s$ k k$ d- |! @+ I21: q9 j3 M3 Q, L4 }' n3 H' \5 h2 Q
运行结果 : b Y. K4 j% G H: N, E3 ` / j* I$ M3 p, m3 E" ltrain score: 0.8953944927234415' q3 d/ D! j. @+ x* P7 K9 F! S
test score: 0.92041362808056392 c: a0 f! @: M' g* |* C4 q6 r
1$ c: B3 T$ `0 f9 W' x9 w
2 e( A( @8 l+ }, `( p" u2 C+ ^可见,训练集与测试集的预测准确度有所提升,但是再对alpha进行调小,可能会由于特征系数变大、斜率变大造成过拟合,从而造成训练集的预测结果高,测试集的预测结果低,出现不泛化的现象。8 ~9 H5 Z5 [, g$ J1 V: F
. q0 X# \1 I" ^6 p3 w* ]4 V9 pLasso回归/ c/ }: q9 c( _4 r( H% X% l) I
Lasso回归与Ridge回归较为相似,也是采用正则化的方式,控制特征系数w,从而达到泛化稳定效果,不过Lasso采用正则化L1的方法。1 B! C$ k0 J. r0 R0 n, l* S% [9 w
+ Q5 w3 A& [$ ^ T2 d$ o
与Ridge不同的是,应用情景若仅有几条重要特征时,使用Lasso较为可能更好,更容易理解。 % ~; K% s4 d! h5 g$ J3 E/ t- a( g4 U8 w& a! \/ [; ~6 F# ]% O
from sklearn.linear_model import Lasso& a0 v. N: B" U+ J1 b
from sklearn.model_selection import train_test_split 3 ]8 }1 D- R, A" X |1 Pimport matplotlib.pyplot as plt! s: D |/ l1 B+ q& ]6 n2 Z4 l \
import numpy as np ( L3 E$ {) v" r. @3 [7 E" n, p$ E6 E# g/ m: ?/ D( A' q) D5 B6 f
X1 \5 _7 o; W5 R1 j/ U
#生成506个样本和105个导出特征的房价信息数据集: e R/ S2 r6 x% X& x9 I
X, y = mglearn.datasets.load_extended_boston()# k1 q$ u/ B5 m0 V
P. g6 x3 P7 C5 z8 G* `- R & F* |1 t m& W a#将数据集拆分为 训练集与测试集( ^8 w9 c9 p) ]2 i
X_train, X_test, y_train, y_test = train_test_split(X, y)0 y$ f; r- ?- E+ V
: M+ G- M, A7 c9 _/ B4 {' C+ p- O6 q
#默认alpha为1& @$ f3 p3 z5 w4 u
lasso = Lasso().fit(X_train, y_train) 6 S7 i/ B8 e( m$ U 0 a' {8 r2 u! ~% d" f/ [* N* E3 i8 G U v
print('train score: {}'.format(lasso.score(X_train, y_train))) #预测训练集的准确度 8 u3 t% B0 {: Y* a yprint('test score: {}'.format(lasso.score(X_test, y_test))) #预测测试集的准确度 ; R, ^; T3 w0 Z- Fprint('feature num: {}'.format(np.sum(lasso.coef_ != 0))) #Lasso模型特征系数不为0个数- d) d* C: Z8 G8 J
6 p) l+ ?2 A+ G4 o2 c * A7 z6 b/ U. x/ y! }7 q1# O: P: f2 g9 `# q
2: j. ^% _% C9 E0 C% c3 x+ j5 o/ x, ?
3& T' { X% }9 y; i2 v. A: j
4( z) U' ?+ U: C" r) @' T/ U" ~
5" T. p' {% I& W1 t' {
6# s* I$ @( d' a: z1 |8 e
7 6 ~0 q" O6 j w$ p+ L8 9 V9 _0 F% U1 A, l) m9 / ^9 @ a' ~5 z2 A& m, b5 P9 M10' g2 ^. y- f# s4 }: H$ I
11% Q/ a& c, H# f# s a
12 9 \1 d( Y# N' s13- ^ H4 J9 g% I1 x# V
14& c/ O S2 I; w$ E5 ?& }5 q# q
15 3 X; X) m& R4 i4 H% t- d16! I& p. d- F) c# V' t
17" _2 }- w9 B% E
18: \# j f: k P q
194 G" {& r$ x, A4 A+ n$ @. H
207 @! o# X3 G0 A- Q
21 f; E4 v% x) N( H, W1 b* L226 j+ o6 Q& G" Z U" Z! n K
运行结果; ]7 ]) v4 F/ j
3 D* k4 [) @' |/ T5 Ftrain score: 0.2609501463003341- w" S& _9 B( [
test score: 0.22914497616007956 ; L) I) l D9 f Hfeature num: 3. ?$ I* [8 ?, x, d% Z$ y; Y C
1% Q6 z4 F+ V- i* g' z% S
28 I8 Y7 ^) B& a) A5 S( H
31 f D9 ~1 V0 J6 Q" o( r
可以看出,Lasso在训练集与测试集的预测结果都比较差劲,105个特征仅用到了3个,正则化过于严重,对alpha参数进行调整,减少约束,可得( W `, u8 u: {2 u* h# t
- E- R& n4 s5 m$ v% ]
from sklearn.linear_model import Lasso % b6 e0 p' n# J5 P+ Afrom sklearn.model_selection import train_test_split* w# t s$ B/ N# B9 [
import matplotlib.pyplot as plt6 d( B5 l. ?5 t
import numpy as np% A0 |8 y+ N4 ]8 a/ _
& i) ^& R1 U; U# V* Y/ Z; u4 D% F6 Z4 x/ U
#生成506个样本和105个导出特征的房价信息数据集; G2 }; h# J6 e
X, y = mglearn.datasets.load_extended_boston() 2 m8 l* i8 w. P6 {. m+ i( d0 w: Z; }& D. `# W$ p
- Y6 l }3 v N2 h. t2 j#将数据集拆分为 训练集与测试集; r c% X+ D- X" a3 V+ T
X_train, X_test, y_train, y_test = train_test_split(X, y)9 i& v6 t9 k, V3 R6 V
* W+ i) Y! I* g, V" K0 }3 x. y/ ~ ; B/ j3 m0 ]* S1 y" @#默认alpha为1,调整为0.001,减少正则影响,并增大迭代最大次数 2 W& ?+ b( Q) `1 B0 s( J& _lasso = Lasso(alpha=0.001, max_iter=100000).fit(X_train, y_train)8 N/ f, l; |) B
l8 f' X8 {4 J9 ~ L
0 r. d/ M9 w% x
print('train score: {}'.format(lasso.score(X_train, y_train))) #预测训练集的准确度 & U; u: S- S W- I' wprint('test score: {}'.format(lasso.score(X_test, y_test))) #预测测试集的准确度2 e7 G/ C. l! p' S
print('feature num: {}'.format(np.sum(lasso.coef_ != 0))) #Lasso模型特征系数不为0个数 5 F4 C, J9 h) w8 p: L; V2 x 1 W* C) z" ?" U5 @# N) Y& N/ d; |* {4 L, u
1 + z* K& h. F- z6 _& p4 d2 , O1 j" h' W& [* c3 7 \8 Z2 T0 M2 o4 5 a9 H( ~! o+ w53 S0 S7 R5 Q2 L
6 / Q" m" R4 P! T: E2 T7 ' r0 R1 @" |4 ~! O$ Z8 % P: ^' ^+ O, L+ Y2 I9, s8 a4 m: P4 @# E5 T+ U
10- l# G0 A2 U/ T2 { {, t8 C
11& h3 P& B# ^ z( k
12: ^) Z. [' ` m' f8 C4 z
139 U, Q; x; A, }5 q
14' j- Y. Y( G7 a' N7 ]0 a$ M; Z
15 6 C1 N$ r% B& y16 0 a, @5 v( \' w/ b( }) b h17 1 h: W% i$ x: K- H188 W( M; B4 [3 c8 I
19 * l4 F& F/ K# c/ h6 Y0 a5 b20+ ]+ x: m/ ]# }$ D' l$ T; ^
21 5 i8 [( o) U! Q( b22& M7 k' h: z1 A7 i
运行结果( q* e \' l r, u% X& M: O
3 Z. d8 T2 \8 c: T
train score: 0.91260761942819422 I5 S, r7 x6 H# p8 ?
test score: 0.9174465452887482! f( j' _5 V/ h; @* C
feature num: 734 w2 F/ `" ^' I& K. H; K5 [
1" a3 X% u0 D& i9 q" f
2 0 E1 S5 C* }6 o1 x3 ! H: q9 p; ~+ B( G6 c/ P$ w训练集和测试集的预测结果均有了明显提升,且用到的特征系数也有73个。' A$ ~8 o j# R! [# o- p+ k6 g
. ~4 \$ }: Q# r0 q0 Q3 C* D$ g假设再次缩减正则的影响:& `$ E# v/ L; i( M
0 c% w' x9 k, G8 k2 N4 B8 t7 Q0 A
from sklearn.linear_model import Lasso0 ^7 B8 N3 m) _4 M5 a5 P. i
from sklearn.model_selection import train_test_split ( m( r& I$ c6 o& {/ g% \, k) A! ?, ximport matplotlib.pyplot as plt 8 c# x% Y7 u# B% nimport numpy as np ) i4 Z$ m4 [& _4 A3 O( }' M9 x/ y' M- w, s' D) o
6 z$ X) k% x$ j0 v: K#生成506个样本和105个导出特征的房价信息数据集 $ d8 N. A3 i8 N5 A7 AX, y = mglearn.datasets.load_extended_boston() * \/ O, v: {5 F" o: r; N: i( f- {- W- k. ~; k
L2 a; a# ^. b: w1 ?. A#将数据集拆分为 训练集与测试集; c$ w; T8 V0 r# J' Q
X_train, X_test, y_train, y_test = train_test_split(X, y)5 t, \9 G4 c9 {! e
& W: z' m, h4 t
) B7 K/ E7 \0 D# C
#默认alpha为1,调整为0.0001,减少正则影响,并增大迭代最大次数 , K$ C' m, Y3 P- s6 mlasso = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train) # p! F5 H) _, H" ?4 N# g* E v , U2 y2 |' o6 w% |* T g# u: y- y # U5 L3 `- U, F7 q: |print('train score: {}'.format(lasso.score(X_train, y_train))) #预测训练集的准确度- h+ ?! f, j+ F6 Q7 p) [/ B
print('test score: {}'.format(lasso.score(X_test, y_test))) #预测测试集的准确度 : ?( S9 @" E7 B4 X, tprint('feature num: {}'.format(np.sum(lasso.coef_ != 0))) #Lasso模型特征系数不为0个数+ ]0 b4 M0 |: w! p
: s0 W; ^8 @! C/ h3 V: @0 n& x/ ~% U# X- a/ _
1 6 H, U( k' T% ?5 ]" \+ l G3 j2, |* d. d. [9 c% Z/ S- R& F
37 G0 h$ P) D' k, V% C% ? h
4 . u! V5 A4 s7 S0 k7 y54 u/ E5 M) N* R% G& p9 q9 ]
66 r6 i( a! z! d2 j7 P% L5 d s$ s
7( [* V+ j( t7 o$ L& K& j' g
8 . m, C7 f# r. m5 c( t& o1 ]9 8 X8 O; p( p" X3 @10 . B# d5 P: |' Z8 E+ V i2 \2 r( C11 : L- M* h( e. A& R+ S5 B. T! y }12* V# b! z: u) H' c9 B1 P
134 Y# s* s0 G" K1 s' ?. X8 C& P; X
14# }( i2 I7 _9 P
15 . m! T2 F* x2 G9 x16 7 C, L" q5 F' P' W( {17 0 F M& d* o, p% a18 * x8 m G7 ?% K, s3 n- o19 8 a0 e8 a& {4 Q/ @0 J! Z20$ J: M$ h( K& _- v
21, [9 w% K! k: f& G1 t* X
22! u% R- ^ |0 [; ^0 S M" l( X
运行结果 7 d: n6 K, A [, \0 P. h ^5 }4 \, T/ i/ J8 c
train score: 0.9439155470053099 , q, b2 A6 Z# `+ c' Utest score: 0.8116708246332489- k3 w! I$ S) C6 D f& x+ ^: I, o4 A
feature num: 91( ^9 f8 j* g9 K8 W% _& F. I% I
1 4 M k n! o+ s2 7 i( E* M" z" b) u3! s- y- M" l" J7 O! a5 j+ i% Y
可见,训练集与测试集的预测结果有了明显差异,是过拟合的特征,表示特征系数影响较大,需要再次调高alpha值加强正则化,减少特征系数影响,缩小训练集与测试集的预测结果差异,增强泛化效果。5 h' e' U5 t( |8 h4 V
1 D; Y \% a$ i+ f分类问题的线性模型 * c3 \4 i- t7 ?4 D' s3 e. z# Y8 U0 y线性模型也可以用于分类问题,可以使用以下的公式进行预测:; [& ]; ^2 j" \9 t
0 b/ ]; n! c( W! @/ z. f4 B
y = w [ 0 ] ∗ x [ 0 ] + w [ 1 ] ∗ x [ 1 ] + w [ 2 ] ∗ x [ 2 ] + . . . + w [ p ] ∗ x [ p ] + b > 0 y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ... + w[p]*x[p] + b > 0* m3 B$ e! X( O \6 i% x c; r. d
y=w[0]∗x[0]+w[1]∗x[1]+w[2]∗x[2]+...+w[p]∗x[p]+b>0 : z( R; A0 ~3 y, p! r" z $ H' h ~& d! S2 y) u3 O$ |该公式看起来与线性回归公式十分类似,但并未返回特征的加权求和,而是为预测设置了阈值(0)。- [5 W2 V2 F, u8 r! H/ F
! b9 Y( p* K ?; d对于回归的线性模型,输出的y是特征的线性函数,是直线、平面、超平面等。; T! `0 ^% [' w9 ?' h8 n9 P
* U; o; U) I& }+ y! H) k; J# W对于分类的线性模型,决策边界是输入的线性函数。换句话说,线性分类器是利用直线、平面、超平面来分开两个或多个类别的分类器。' o' G, a/ s" @% ]
4 }( i& L9 Y5 q, Q0 m5 ]
目前较为常见的两种线性分类算法是 Logistic回归(logistic regression) 和 线性支持向量机(linear support vector machine, 线性SVM)。 & O6 V4 R. f) o / ~- D; [, v2 j/ J) p2 Q1 mLogisticRegression z2 k/ P6 }% n0 ?1 }将 Logistic回归 应用到 forge 数据集上, 并将线性模型找到的决策边界可视化。! o: G3 T( D8 Q( B
8 v6 L/ w4 \! G' G% _7 b( F4 o
from sklearn.linear_model import LogisticRegression & I- {. v. I; a, ~, ]7 G- @/ iimport matplotlib.pyplot as plt& ?6 K- } E5 c( g# |
import numpy as np) w( y0 W2 ~+ q% C
import mglearn3 h* K0 m, z7 u+ a
. R) c6 i( [! ?: }) v& S. k
# 生成 forge 数据集$ s+ ~8 y4 w7 g6 t/ o! U' @
X, y = mglearn.datasets.make_forge()/ @1 C p' m8 b% O( P
2 }7 f& [4 S/ l- m% ?4 A#Logistic 回归模型,训练数据,默认参数 C取值为 1, P; C. r' Q! j$ a# X5 y. w
logistic_regression = LogisticRegression(C=1).fit(X, y) % s( x- w6 w. }, m' E( l- g$ X; G! z" q
#绘制分界线 8 x2 B( u5 s% o) E( T) w' Ymglearn.plots.plot_2d_separator(logistic_regression, X, fill=False, eps=0.5); m4 a+ n/ t8 l$ a% Z, e
/ P/ d' n% T( S d. S6 ^5 N
#画出所有的数据点及类型- O/ ?, N2 Z T0 p! g% k
mglearn.discrete_scatter(X[:,0], X[:,1], y) * n+ p# H) D6 {) S3 K 6 w- g' N, A( l qplt.xlabel('feature01')! Y2 _1 I. K/ q# A5 H' h( a& h9 l9 {
plt.ylabel('feature02')! F" @1 n4 J$ w, @" N# E4 w
plt.legend()# ?) f0 l, m5 P/ E
) x: h/ S9 s& ?/ V# f8 h* G
1 7 q" \2 u0 H: j9 I9 d+ d2; V- e. e' I8 x
30 L- I# w- w" N
4- S6 K: Z+ _* d) x. Z0 _
5 , d% z' ~5 {) k4 d* y9 l66 C1 @9 ?( N- {( e# e( x) b
7 $ C- y+ x' g0 _7 z+ q# v7 _. b) \' B, [8 0 n) r; X/ H4 Y6 E9# r8 T# u% C1 Q5 x" u
10/ [5 `- e9 R! A1 W* @1 z
11' |/ v% n% d' V3 J1 w# l0 |# L# W
12: l8 H- K9 w$ d$ O) Q
13% h2 ^3 z' `3 Q+ x! A) k
145 A7 Z1 z3 R1 { j
15 u$ L. x3 W7 L! P/ T& \( y% j16 . I, [) Y/ I6 r' x3 H17: }, q# h( R# P; `# f/ x4 _
186 F) T7 c0 e$ l" u
19 1 i+ C; g3 @3 ~) u6 N- m20 & R7 w b; S, s$ U# }( n5 R, m# U , y8 @, M8 z- T 2 Z) b9 i* A$ I+ _! E1 ?# Y4 A由上图可知,在该线段上方的数据将被预测为 1, 线段下方数据将被预测为 0。 . m. O* B9 b. ~) F; B$ i; `) e : M! q/ F4 C8 `* |# A当我们修改 LogisticRegression 的参数C时,该模型会做正则化调整,类似于线性回归模型Ridge和Lasso。5 a: ]' u6 u x) ]: G7 t' Q