% Q$ X* b8 t& p' x3 m. G x=自变量 6 E' O$ @. J$ y+ t7 D; c! A; u2 J3 c S: W/ [ n2 `9 D
b=截距 4 \1 w. ^) A$ N$ @ 4 K+ x3 v& D o8 o* f% V a和b可以通过最下化因变量误差的平方和得到(最小二乘法) 5 O) t0 F$ |9 J2 l0 a 5 [ [6 A* k1 A6 o我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。. V- X+ k$ P& K. N M' C9 {& d
% G$ [- `1 r2 V/ A
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.7 u {$ r1 m/ f4 w3 Q3 }
' @5 M9 X, i$ m8 C5 L% H" c0 i% t, ^, N# a% p
( K/ W: O6 |$ p. I( y9 ]/ ]2 v线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量. 0 O, ]$ T1 Y) A! Q- ^' @& R. T+ \( e$ U( g% K
拟合多元线性回归的时候,可以利用多项式回归或曲线回归 ! R2 a5 l; `) {1 m- s5 B5 q" i$ d& h# G. \9 f; W3 ~: S
Import Library & E9 {) q: Y3 w+ S8 Kfrom sklearn import linear_model " ^" _' i7 R: ~8 h, l9 [4 G- E9 J8 e, Z) X8 j5 F
x_train=input_variables_values_training_datasets, \( z3 H9 Z1 d D3 K
y_train=target_variables_values_training_datasets- K% R X, f: f7 k9 N: F ]
x_test=input_variables_values_test_datasets% u0 y S0 f H7 f9 d
) R0 Y. Y' [+ U/ @2 w, A, n2 y, v# Create linear regression object 8 T$ Y( s, z5 H# O- O) } ^linear = linear_model.LinearRegression() 0 F; w7 f: n/ k+ N, X& |: K: r % ~+ E. f2 M5 I2 z0 r% ?3 j G# Train the model using the training sets and check score ; } G' A; B$ ?. ilinear.fit(x_train, y_train)1 u8 {$ Z2 w& F C1 y `
linear.score(x_train, y_train) 3 g5 G* B( h: s/ Z ' w g0 Z2 \* ^+ ]: X" m#Equation coefficient and Intercept 1 U) ^7 P) ?) L% F9 K: H9 {9 O% Sprint('Coefficient: \n', linear.coef_)- k& P: {. R3 L, X) ~& e! f
print('Intercept: \n', linear.intercept_) 9 h0 A1 ~. e, p 9 c; ~& B: _4 I' A: U5 o3 L#Predict Output $ n3 w6 a7 }1 [predicted= linear.predict(x_test)& s7 Q: \8 J' u5 D6 c0 ?
2.逻辑回归" W6 C% ~+ n4 k+ M% F
逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归! - z2 O% n; R5 }; U: [& J7 K# M e5 Y( d% P3 I& \# U
同样用例子来理解: ( ^: p7 `4 I% G$ I6 ^9 b' N) j7 S+ N& I1 r. `+ B A7 b
假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。 ) A4 U+ J0 p1 ?4 j7 g" w# T0 v- _* A. u; t0 s6 I
数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧 . Y( N/ C+ N& K - {3 w9 {) i! s最终事件的预测变量的线性组合就是: + \2 s( c( f( Y4 V7 ^. v" n( }$ y, | 0 n6 j% P: X# k7 N0 s 8 U0 B2 Q' V, z) C$ fodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence9 w8 w, ]. S1 ^
% i; ^. T- R. ?$ Q9 V. @5 u
ln(odds) = ln(p/(1-p)). t' D% s" D) b/ B5 F6 ~7 F$ x
. @" w' k4 l+ M' _3 X
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk$ Z$ E3 J f3 {* ?1 y! Z/ K- s/ t! R
在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.6 s! ?; S8 P3 | L$ B! P
: ~" ~/ g1 }, I7 U/ n" S至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法. % R- i( F `& a. D" P1 T' O: T% @6 j) }) Q6 w" e' H
6 Z% [/ S& K5 {, L6 V+ v0 t6 L
1 L# o( k( u6 @+ A7 @6 c& B T
from sklearn.linear_model import LogisticRegression5 g- k0 @% o! S
5 G0 ] {8 u3 ^# t# O8 j model = LogisticRegression()' F+ T6 I6 P# J; R' ^
o; ?$ r8 c; F4 [
# Train the model using the training sets and check score2 X9 B, Y5 a8 \- M
model.fit(X, y) . O, o3 ^0 O. _/ @ model.score(X, y)# P) n; t7 q2 x$ H+ C( }
( S# @7 z. m9 X4 p2 d9 D
#Equation coefficient and Intercept ! X! M: @' K" i E4 T, n print('Coefficient: \n', model.coef_)% _; b) x D, d- B
print('Intercept: \n', model.intercept_)" c. |. l1 J8 D9 j0 j
+ K& u% `# h7 i! R
#Predict Output & `9 x/ T( F" G- M# f- b predicted= model.predict(x_test) 0 `* e& h# F M1 W逻辑回归的优化:2 q# K& b. l* M( C
加入交互项6 p0 F, f- g0 Q: b, p4 `
1 k W6 }. h$ _# ]5 Z# ^$ n
减少特征变量" G0 ~% L k/ U$ Q
$ J8 S0 n# d) [" R) g# C
正则化) D3 ^! [. T( z3 H) R$ Y2 J
- B8 b. M$ A1 g2 C) v. ` 使用非线性模型, T: B; l& X0 [+ V5 ]
( c8 }- m2 ?/ w& E, A' W- U5 ^3.决策树# g* d- m0 y; \! m3 W" t% P
这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。 S% W# j* G7 _" s% v# E I# n: U3 E3 ^* r
% A( l+ X1 Q. d' P: G6 _! a- z4 S- [& t1 T* s
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。0 S9 H( t- L0 o1 u4 ^# t3 h* A
$ n+ |5 {/ p$ c' S& y% k# F9 g# l2 g/ H! w
from sklearn import tree 8 i P% s7 }/ S2 @$ {' Q8 a, L! X* ^% u0 U3 c/ o& E3 n8 j
# m# a, ?( |& s7 D4 t& i- z
# Create tree object 7 q- Q+ y+ H; Q0 a
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini : \, B1 K& P: T6 o
! K' o: j2 j5 i3 m9 V' p$ M
# model = tree.DecisionTreeRegressor() for regression; r8 `% t% a- u9 `8 d, H! ]4 a5 h
; H2 G) r) U# T# Train the model using the training sets and check score# c4 N; U G* D3 J' P( p
model.fit(X, y)! B, B2 d- A2 C3 Y$ o
model.score(X, y) 7 E+ E$ I. K1 i2 F: `" E v h" ~6 H# C8 ?% ^( l
#Predict Output 3 {+ M) X; q7 F$ p: X7 F [predicted= model.predict(x_test)# h4 R6 P$ ~. j: Z. k D' j
4. 支持向量机(SVM) ( ?2 }7 }: z# u: \: V$ F这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。 9 z* u4 w2 u' k2 J& u1 R2 I) n; Q8 H& J
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。 ( {+ \+ h& D: A' U/ `. L! z1 J' L( M" n
' I) P6 V. H& [# _) }) i0 Y
- C- q- j1 N" r, w8 K' P
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。! S* q$ U! r+ @! p2 c
& V! m7 q( ]& Q# i, H: L( t
#Import Library T' U) A; q; k" E) ^
from sklearn import svm 7 E- A# j p6 _) L% O) h#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset : \0 o2 l+ ~, w: O# Create SVM classification object + p+ U |) e8 h+ B $ A7 o2 b0 |8 j- b, F nmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail. , d+ A/ D& ?/ v8 Q & g+ K- E7 o" b o) t. W# Train the model using the training sets and check score ( Z* X3 L4 f# qmodel.fit(X, y) ; E1 H* a2 w! Q1 H% s8 v B9 a4 ]; {model.score(X, y) 2 W4 R# u' T5 F y5 @8 S! p9 \: q: B: H
#Predict Output1 U. Q8 c3 f- q" l Z
predicted= model.predict(x_test) * {. W/ V8 v6 r s5 |! C; l/ `3 B6 k5. 朴素贝叶斯 0 f$ Q* ]' C4 L这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。- E2 t' p) l& R
! B) p1 ~/ u4 Q4 A a" W如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。' N; M# Q$ Y+ S: I0 W
1 Q& X; W% H% ~, L我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。 5 H$ o8 @; M, M6 g ) R+ K, |+ d' W8 D; s) V8 G. {5 j) Q3 F1 s: x3 K, K
#Import Library8 ]9 H/ f% B& P' u
from sklearn.cluster import KMeans% e, s! ~$ x( J. S/ j( g( z% f
7 L9 \ @; A1 i4 n" @ }7 \#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset 6 N" P- s* P! \/ r: t1 v# Create KNeighbors classifier object model Y3 \ s2 B$ Q9 ak_means = KMeans(n_clusters=3, random_state=0) 7 c# m. H# Q* c: h/ H9 ?8 U3 S8 H2 T" K2 b. N
# Train the model using the training sets and check score ; y9 `! }- T# v8 P; s. S( }+ R1 }model.fit(X) : G1 }1 c+ M$ d' D$ Q) Z/ M/ n) v# [' n% B$ Y* ~2 z; q
#Predict Output# l6 M; r) m5 o8 s* z3 v
predicted= model.predict(x_test)6 t& K' |* O0 r, B$ g H
8.随机森林! F- I+ {8 @) q9 k: @7 ~
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。8 l9 W- v* q' u( T: B8 F' q
1 H* p" Y0 } Z+ A7 x. F# Z% R
怎样生成决策树:: _! l# u. }9 z1 L# ^: d& A% E
& U- R, c6 o z: Q+ A* e Y+ _
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。 . |5 X2 H0 K) l( e* ^# c( z p* c# s1 ]& j8 j( P9 _, U. b
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。 & R7 R$ y# G& S4 \; w/ [6 z V) C$ f* W7 n; p3 d
每个决策树都最大程度上进行分割,没有剪枝。 , o4 D& _3 b; _- O H( b ( _: r1 E0 Q7 p" O1 B1 e# z) W#Import Library % ?3 Z$ U& L" ?* T0 h0 xfrom sklearn.ensemble import RandomForestClassifier% q1 r1 i3 {. t# a
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset ' O; i& {/ \; m) @6 [/ v& C$ B. T9 z U2 a
# Create Random Forest object , V2 k$ T( d5 t6 m6 }7 nmodel= RandomForestClassifier() % D" z% Z" z* B3 q- ^% |" E3 Q& p: \3 p! a' q
# Train the model using the training sets and check score & s1 Z5 H- y+ N* b4 y! umodel.fit(X, y) ! g. W* Y A( P' S, N( b; h; ^/ }) x$ D9 {) i. L1 {
#Predict Output : `% R- O4 _$ cpredicted= model.predict(x_test)6 @8 G1 q J1 M4 v* Z `- \
9.降维算法(Dimensionality Reduction Algorithms), O& T l# {2 {) {' j% W
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。. I, t" l7 ~. w3 q3 I
+ ^2 N+ ?& D3 t, h8 a例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。, V* \, A/ M0 a/ X* F, m4 J
% p$ @1 Q' W( {6 H) `4 ^+ `
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。 : f" S+ E8 {0 r( o- r , |. V- k* |; G 1 S0 A- b0 N, Z. b8 A) R% T#Import Library0 }: g2 s1 U3 X! V% l4 E+ _
from sklearn import decomposition % w1 G$ j1 h6 I" C/ x#Assumed you have training and test data set as train and test " v. ~3 _+ j3 i+ |# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)' ]8 Y) ?- i1 q$ O
# For Factor analysis 3 ?3 {2 N* F! u; ^- H' h& W5 P#fa= decomposition.FactorAnalysis() 4 A" ~3 l% L2 w# Reduced the dimension of training dataset using PCA8 I4 H0 ?& |4 v% u2 i
# Z/ }4 ]# W; k3 Y3 O
train_reduced = pca.fit_transform(train) * y! W( b: U; t- _( b5 w; [+ d N0 ?3 t! X* ^* [- S& z#Reduced the dimension of test dataset & k/ a8 t% U/ R& i: H! z3 Ktest_reduced = pca.transform(test)8 s/ M( ?; {& o l+ G
10.Gradient Boosing 和 AdaBoost 9 ~0 t7 l3 @$ D! V. eGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。! v6 q0 l* f* T8 M
: U2 m7 H; E R( \2 {! b
#Import Library D" W1 p& [$ p
from sklearn.ensemble import GradientBoostingClassifier 7 K3 X9 J9 d- b9 o1 S#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset & c' @) z* }. Z: P% O6 ^- J9 H# Create Gradient Boosting Classifier object9 n2 [6 V4 H7 P$ `* g
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0) ) l. k+ N- r/ q; j t" G% C& [$ { O T, Q- H
# Train the model using the training sets and check score 2 a7 J2 `& A: Z; l" S) I& b4 Wmodel.fit(X, y) 4 r' I3 x& n5 P* g! y2 b& W#Predict Output- f) K! @# }; o- d; T+ w! z
predicted= model.predict(x_test) # ~1 x! x& e0 u2 H- O$ ZGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。 , d6 c9 B$ P$ r/ M; W8 ] 2 ?/ v3 g8 J9 R0 P8 }原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386. i1 K: j- g6 a, k
————————————————* r9 ?" t' W- Z) B
版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; Y" K' M( e( b" Q- o
原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075: _& X# ^8 G9 }: w" F
* m' B' H1 G: @3 j. @. ^) C