1 |% z! J! i: u8 y' D+ e# Z在这个Y=ax+b这个公式里:$ Q! D; G6 h. U- i
+ n6 S7 v% j$ f" a
Y=因变量( b, O8 w7 G, @$ ?
3 A! M: K. S: o, ?/ e6 B5 X a =斜率 0 P6 V( O! Y* I. p6 a: d- P H \) i/ Y. l! H2 a
x=自变量 ) ~, Z U7 {& }% u Y S( M" o" Q4 @9 h b=截距* ?6 A6 \4 d7 k: X$ v5 B4 J& e
4 p( |& w2 m1 C( a$ y a和b可以通过最下化因变量误差的平方和得到(最小二乘法) 3 r M+ l2 E( Q: B! a& @ . x) m# g2 O( @3 O7 P& F我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。 D+ G9 C X1 g. l( f: K. F" y) z ! k8 k& c; U! i! Y- ~& W, F给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息. 6 V4 A* [! m/ i9 N$ C. s4 ~- E" |1 s u% d2 ?0 _9 U3 R8 c) t0 x! Q
3 @' v. W9 v; H% T: x( u) W5 y! y X! E4 ~4 U$ H, P+ V
线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量. ) E3 x7 u8 @, h& \. f 0 E: D! I8 U5 h; W+ F$ ^. v拟合多元线性回归的时候,可以利用多项式回归或曲线回归 . |; i6 I7 G! i; a+ b- e! G8 O7 A! F @3 j
Import Library* b$ u' b E7 H" c* ?
from sklearn import linear_model $ a' h, z- j8 J : ]5 p5 K6 A5 v) J9 J. p& \x_train=input_variables_values_training_datasets 6 z; L8 H u# L" T7 Wy_train=target_variables_values_training_datasets5 I, ^3 X s% D/ k! }1 C; Z5 C6 _
x_test=input_variables_values_test_datasets 1 F0 ]! y2 y% Y: k8 S; z5 I 7 z# E6 l7 Y4 |6 U# Create linear regression object , E; _% Q a" {2 E0 S+ Vlinear = linear_model.LinearRegression() 2 Y! D+ L8 B- T4 r2 T3 n 8 M5 o. A2 i' T$ g' s: K# Train the model using the training sets and check score2 l# q A1 T- x3 w
linear.fit(x_train, y_train)0 ^9 J9 |, a7 y- V
linear.score(x_train, y_train) 5 H# y5 K0 K2 H/ N- m " w& F3 R0 H ]#Equation coefficient and Intercept # j+ E; A9 k/ S, Yprint('Coefficient: \n', linear.coef_)0 ]. F4 t6 R; u: X& W
print('Intercept: \n', linear.intercept_) 8 T/ E% M/ b0 l l8 {+ d d/ `) V6 \) ?! E; ?( P
#Predict Output ! R+ ?2 ]% p; `predicted= linear.predict(x_test) - K a" V, y- s- o2.逻辑回归9 c( E) D: I3 Q {3 b" { y6 q
逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!2 i: v0 y7 V3 b2 {+ T" K- s
. T' E9 o$ h( k
同样用例子来理解: 1 s/ Z! a: H6 ?: l. f ! K7 w$ G# k6 c2 b; d$ E( U6 X* |! j6 B假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。5 X4 V3 k5 g# l. t; B6 B/ N
+ }0 O0 L7 F9 C) p* ?8 w; L) [数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧 / B$ t+ I" J" |5 d4 t+ ]4 }! p% F/ X" G# p& Z
最终事件的预测变量的线性组合就是: 3 X# H# \$ e( y( N) S4 e6 @) F) X# u. j# p' K
/ T3 j* h( K$ m4 F$ zodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence$ L/ s% U% {2 Z% t3 }' r; H# j! A! z
7 U' ^8 g1 _. X @2 k! W2 x0 y from sklearn.linear_model import LogisticRegression 7 N$ \% D. A1 ^1 M7 V- ^, d5 g z& p* A
model = LogisticRegression()1 E; [2 m5 X9 j! S! O! \
: ]/ Z) J7 I0 i' b7 x
# Train the model using the training sets and check score# T4 ~/ ]# S# V6 V/ _7 i5 y4 p
model.fit(X, y)# s1 b, a x* {% ?5 m8 `2 t
model.score(X, y) 7 n/ R' }* ?8 k' F+ z2 N1 H: Q8 ~ n# H: v+ ~; R. C g5 ~- s
#Equation coefficient and Intercept5 y# r \9 F+ a' w* ] Y0 d
print('Coefficient: \n', model.coef_) ( [. X$ E1 |3 U print('Intercept: \n', model.intercept_) 4 D1 E, T& x \% e0 q6 c6 r4 z8 o5 R/ L9 E
#Predict Output + h8 d9 x5 R5 k3 P' M predicted= model.predict(x_test) 4 K% y7 o0 J/ \5 M; G$ X9 T( |: c逻辑回归的优化:: ]5 k9 I- \2 S2 t6 a4 M
加入交互项 * w( o6 a+ Q7 m9 z z- ^ ~ ! d# ~% u3 @5 P( q 减少特征变量 z. F( [( O% i/ B* P4 F* J 3 ]2 r$ g/ ?7 D7 m' x4 x6 B 正则化 ' T' W5 h+ y9 ?3 w$ [ 6 |3 K: V# ? s0 n; J 使用非线性模型 / O+ U: ]( K& H $ K3 A, I2 D- b0 s4 f- ]* t3.决策树6 E) L7 x8 Q1 u" E
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。 # h, y8 Q. [# t$ a: V5 J: i9 _0 x' G5 N6 q# l, V/ \& ?# }" o
2 S+ I/ f: w1 }9 I3 N! z
) n o; U7 F8 H2 ~8 o( F5 B7 P从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。 ( {3 ^# v2 g4 G+ S2 V6 C& G" I. F) {6 [! |. Z. t3 m
5 E4 |; ]( R4 G h
from sklearn import tree: l7 f1 C& u& r/ F4 d
, C9 q6 |& s4 n3 |6 _# k
9 ?; c6 n5 B7 I. p) b* Y
# Create tree object # V+ q4 x M7 C# ^model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini 9 g- X* }. z: B# Z; b1 y* U' ?( S# L, ^
+ ~: T- i: Q+ J$ P4 ~# model = tree.DecisionTreeRegressor() for regression2 X9 n. e9 }6 Q8 E, W* @( e4 d+ x
6 Q' V' q: P" D3 B, L; [
# Train the model using the training sets and check score 0 Y5 v+ m1 f1 r V7 e7 dmodel.fit(X, y) z" @% ^4 K( l* Gmodel.score(X, y). H( A# E {) V6 x
& g/ C$ Y {$ P4 P% O0 B6 Z4 M7 S
#Predict Output - x+ N4 V( o s9 t9 d( Apredicted= model.predict(x_test) - j+ c V; x ^: t5 f& F4. 支持向量机(SVM)/ F1 M0 c8 V6 `6 F/ i- O) v0 ?) {, M
这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。. z: N& j0 R- H/ x8 }
5 `) V4 f R( f2 v- u
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。8 ] {0 v. S' I; Z, l
5 `' ]9 {6 U4 f; j+ K0 z" K: G
3 A9 y6 g( e: [8 ^1 G2 W
6 A2 y, [! @# V. R1 v$ K; }" o- C在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。 0 ]- V& I: Y- n1 _ 2 s7 k9 H; O A1 g% |& Y#Import Library : W% s- y5 K8 W/ Vfrom sklearn import svm) _- o( U$ _$ ^
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset7 Q+ F7 h5 K4 X7 W% \- H! \2 ?
# Create SVM classification object & b5 I! r+ r e7 i4 c" v; X% h
! I* Q% d6 d/ w( q0 T7 Vmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.$ [3 _! o/ h$ ?- ?
- ~+ p! w! S$ }% m* y4 f* Q/ L# Train the model using the training sets and check score, H$ O" E- ~! x
model.fit(X, y) , P; I8 ], ]$ }4 T0 { f7 s2 U. ~model.score(X, y) 1 a: P1 T1 s0 @+ a& p( ?6 ]. |. o0 T S1 n0 u; g& c x
#Predict Output- L& A9 M3 {5 y! ^% z0 ~5 }' h9 S
predicted= model.predict(x_test) # @& m4 d# @. r1 I m2 y5 q+ D5. 朴素贝叶斯 , r+ I. P9 ?1 \/ q$ g, J2 t8 q这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。; \2 j2 g: o% W7 k/ f2 J/ d
% I4 H" j+ Z/ O当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。 2 K1 R* q' R( S) F& S" ?% { Z' Q' J1 k
#Import Library 9 T) n/ l3 [6 O: _. pfrom sklearn.naive_bayes import GaussianNB7 ]! o' a( g o" P- a& A+ S
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset v% ]2 w/ k9 G" d* ? & R! y2 h, K' l. n' U$ A5 R* E0 H# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link : n2 c* _+ Z1 e" l& A; E( |* g ; Z; {- w" ]" g/ g7 a* E# Train the model using the training sets and check score 1 T. r# c5 Z8 M/ T- Z7 Y+ Umodel.fit(X, y)9 ~# i) o( c2 Y
5 l' J2 K q$ ~8 M6 iKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。( D( f, K5 U' r( o, p& N
: f8 k# J2 z" T# k! D2 v8 t在用KNN前你需要考虑到: , v L; _# a: G: N @3 q! O. _4 z& O& }7 x
KNN的计算成本很高 1 @6 g3 `2 i1 B x% y8 l) s! R- q& _1 ^
所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。. f# J. P7 G- w! Q
- j6 Z( x: f5 J在进行KNN前预处理数据,例如去除异常值,噪音等。 1 T" K8 ]3 B% f5 F& z4 _' z$ v" v- m" }% V( |
#Import Library 1 B2 n+ y7 v" _3 K1 @9 h! q0 Afrom sklearn.neighbors import KNeighborsClassifier $ d1 ~8 B) c+ T$ }; X. } ) n6 h8 ]" X+ c% r: _#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset . u4 L' S$ E& J5 e, i% W c# Create KNeighbors classifier object model ! @" }9 L L6 A
7 L7 \: n" W" o x3 p
KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 51 q) h" M2 c: b' u, ^ V
/ |/ u/ J- G' F) j4 K- X# Train the model using the training sets and check score5 o2 b$ s) b" |$ j {
model.fit(X, y) % p6 |) Q+ ]( L ]! {* f$ n$ ]/ { 1 ^0 p# x- |: {#Predict Output 0 j3 E5 x6 }9 d$ mpredicted= model.predict(x_test)7 a; T! S) z' t Y
7. K均值算法(K-Means) ' g; K% W* w# r+ [9 Z这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。; {! @( R- i9 t# D0 p9 |
w# M; s5 }+ `0 [1 o还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!4 h* q$ X. ~. l5 I9 y# C8 ^2 U$ L
" U; d; Q: Y$ Y
' S3 n( Q6 ?) m! F& p! H
K均值算法如何划分集群:6 v% p5 {! P# E7 V! H8 R0 B
/ l2 [2 s" ?* n6 J9 x8 f
9 A5 a/ P+ D1 ]9 }' {& c
8 z" s$ t5 g" F5 x# ]. W从每个集群中选取K个数据点作为质心(centroids)。 7 o1 I! |5 M7 `3 m; T* i# r8 E! }$ Q0 }0 H" Q: Q/ _/ M! _
将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。 5 A, K8 R+ I) f0 L7 b0 k+ D% j: n. l& ?
找出新集群的质心,这样就有了新的质心。 d. Z. r' g4 R. E! ]
/ w1 _% |5 D; L) [每个决策树都最大程度上进行分割,没有剪枝。6 ~- s. ~, L, H. w
8 y. ?" L6 x4 v; Q( j
#Import Library1 A! S% I: u9 l$ \3 y5 a
from sklearn.ensemble import RandomForestClassifier - e" f; G4 b, M0 o: x#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset) V) Q3 D& ]% C% ^& q
' t+ s! K* ~5 x. E( q% P- J
# Create Random Forest object1 ?6 t. b Z0 D1 b7 I( T0 x
model= RandomForestClassifier()* y- a/ O7 k- W6 M
3 g! z, S/ h( l u2 w# Train the model using the training sets and check score " Z( H$ l# s$ G; u% |model.fit(X, y) ! M0 S; Q9 M, s* r" W) H2 t! w0 v0 w9 i
#Predict Output, I" r# Y* s" w3 C& B. b$ k
predicted= model.predict(x_test), }1 C% R0 R3 ~- h
9.降维算法(Dimensionality Reduction Algorithms)* i1 p! A2 ~3 k! G r
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。& N# T7 P. b- M5 t- r, \, s& p: D# ?
4 Q7 w4 P* V! w$ E. W例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。 . s; K! C# v! r1 F( I * |7 V6 q/ L P: }5 y9 W7 F& Q- o a作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。% [8 U! x/ p9 ]3 b
8 k/ h3 d4 T% [) p
' V9 ?. g" h+ d$ t" D1 w
#Import Library) P/ n) R% K3 K* R( X
from sklearn import decomposition 3 `$ p# R$ Y' N b+ X#Assumed you have training and test data set as train and test) g' G0 M, `& x: X
# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features). u! l+ V7 n! A* t9 m; B" u
# For Factor analysis 9 K0 t' m7 n0 ~# Q5 a#fa= decomposition.FactorAnalysis()% ]' Z% ~; T. I7 p `4 L
# Reduced the dimension of training dataset using PCA 4 P: H* [" s& q$ H+ h; m0 j: X) W5 o; o8 S5 q: }' q
train_reduced = pca.fit_transform(train) # B! |; j/ I2 h0 ]: e' d7 L1 ~4 N: Q9 l0 J, L" \' t4 I
#Reduced the dimension of test dataset 0 L2 M, a; J4 V/ @, G7 Ktest_reduced = pca.transform(test)5 L* s. T; Z, B5 |! t( V" i$ s, @) T
10.Gradient Boosing 和 AdaBoost! v) |7 Z" R6 S6 M+ ?6 R
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。 . y4 e, X( R( {$ Z 9 e1 ]$ u, G4 O. K2 U#Import Library5 O8 F; J% g. D6 Y c3 I& C+ k
from sklearn.ensemble import GradientBoostingClassifier( B6 {- ^2 b; v% e- Y
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset ! \& J& w8 Y8 R# Create Gradient Boosting Classifier object9 W( |% y+ ?6 r) f8 _" D" U
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)" a" H4 b) W+ {% Z) s: G( F
6 t# b5 u4 v9 D" Z! S
# Train the model using the training sets and check score 0 y1 J1 v* G$ n( v% O! Pmodel.fit(X, y) ) `# v4 |" }! @% G, ?#Predict Output) S; J3 X; G$ R$ I1 V. k( J
predicted= model.predict(x_test) 4 c# C7 x( `- C5 w' X# Y' F* UGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。 1 m0 B# F$ D- s+ R 6 @: C8 U8 Q, R原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386 ( L4 R" j2 P0 [" ^9 |———————————————— 4 B* ]8 |$ b" S3 a版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 G% s. O! v" ]2 B3 ^0 m9 N' {& }
原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075 4 k2 t9 V: ` l: O: }- O2 Q7 A. t S. ~- U
, z/ m. ^, u; K0 L5 K