& s+ [9 C0 h: M F5 v9 F$ u7.K-均值算法(K-means) 6 e0 A1 H+ q J0 w5 W : B7 A( L7 o$ j! O, B. [3 z8.随机森林 (Random Forest) " s! t9 w8 o& T8 \$ z5 I6 C g7 K J8 D; x0 k- p8 v [3 C
9.降低维度算法(Dimensionality Reduction Algorithms) : k" l3 J6 P) [) E/ u + ?$ S! m( b8 M8 N2 |2 ]; c9 U: m10.Gradient Boost和Adaboost算法 2 R) j5 p* r- R2 r一个一个来说:- \1 ^% m5 j! b1 f$ G0 @$ t
1.线性回归 1 b- e" u$ ^7 u2 R$ R# H& q6 N 1 j2 e, I m9 J; E: T2 e* @线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示. - y! X3 `0 w! x- t+ Z 6 e* _% J$ |/ I在这个Y=ax+b这个公式里:& k- Q" P {/ a" u7 B
* P( I% o+ x/ j1 x9 \ Y=因变量' M. N* t% X+ l/ i' k9 `' O
6 l/ [+ p4 u8 B0 k1 x a =斜率 + C4 T% ^. M, `+ W+ Z) M8 l , S# y: I. p ]" }# @) e/ G x=自变量 , Z" l0 r" n1 t @# u/ `! u! l: L B( a) ~' L6 R6 ]* O4 g
b=截距 1 L; ~8 l6 }* Y8 r, F( L$ P$ I1 r1 O+ J9 T0 j
a和b可以通过最下化因变量误差的平方和得到(最小二乘法) 7 o" U$ |& \# z3 { 3 {7 v- ?1 x3 k" A$ I8 V我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。 ; |4 e1 K- ?& p- r T$ e; L* J' u* x8 w4 A: S
给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息. ; V+ f5 P; w/ R. g# o; N" M9 P9 o 9 ?! M7 d; [1 E- Y% h2 e4 u: O) s; C, m0 R- I
# H/ G1 [+ R5 p: n1 z' e: q线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量. " g$ O* Y1 u* E( S1 x3 W Z- X. C" I/ Y. k( ]9 T
拟合多元线性回归的时候,可以利用多项式回归或曲线回归 . O/ z# L" Y. s 0 l2 k' B) R7 w, ]Import Library 4 Y3 W" r% ^4 ?; P Y4 U: C( hfrom sklearn import linear_model 4 H) m- \6 W0 x9 w1 m" H; V% b( u% T
x_train=input_variables_values_training_datasets, w$ D9 x! O, q0 z \0 |8 T
y_train=target_variables_values_training_datasets 0 b3 Z) v) e) y( z* l0 y' Fx_test=input_variables_values_test_datasets 4 B. ]% P; J( G2 d- d) {( O/ z4 H& w$ w) d' q8 M- B. c0 w2 K
# Create linear regression object6 e3 c3 C7 J# T4 N& }
linear = linear_model.LinearRegression() 5 @1 x" b5 Q/ P 5 z4 Q/ u7 u; G1 A1 P/ |% J# Train the model using the training sets and check score - ?1 K8 J/ b; t1 I% v. Ylinear.fit(x_train, y_train)8 S* T! d) D; U, J; _
linear.score(x_train, y_train)% u( [& n7 b @* o! \
* }7 w) U' Q8 j
#Equation coefficient and Intercept( S3 J* G; s, f4 T
print('Coefficient: \n', linear.coef_)- G5 P) x- \, o- q& {: c
print('Intercept: \n', linear.intercept_) 4 c e/ K7 |9 I5 M" a5 x 8 A: [+ H9 Q) V7 z: B, V#Predict Output : |3 `7 J! C- D. Q3 a7 y: N0 Hpredicted= linear.predict(x_test) / K5 Z! b9 w% f& n8 e. \* P' Q2.逻辑回归 & R' K5 |4 R1 C9 M& ]; ^逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!: T5 l9 c9 k6 A! \
+ o3 W, G' K6 D d0 D
同样用例子来理解:) Q" d+ O5 O; m7 l3 n/ v( N
7 W7 g l0 H$ A' Y% ^% C. c假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。 7 |& Q# A9 p9 }# v1 c ' S- I4 N# l0 l. B数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧& O) d" B2 Y9 X
. j8 c6 `1 _( m) x/ U; J
最终事件的预测变量的线性组合就是:9 f1 }7 `: p) B1 E8 r* R S% F( s/ |1 h
$ p3 L3 _; f+ `) O2 V* g. l ' m( Q) E, e' G& I3 j* _! yodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence8 j* K0 z* M/ o4 P) ]9 ]% M( a
: ~/ K( F; v* m. G- S from sklearn.linear_model import LogisticRegression & h4 y8 C' T x0 R/ R C; i b) a: S0 x" h6 \1 k! \
model = LogisticRegression() 1 D4 h( v# K- K. u d3 o 3 K1 [/ ^. o& Y" Y # Train the model using the training sets and check score 8 U f4 h. w% k6 l# a model.fit(X, y) . l; ]+ E( v' U" y r7 Q model.score(X, y) 8 y7 ~, m/ Q1 a8 C1 N `3 D' A ; U6 g, { i& G* M* P+ Z9 [5 a& U #Equation coefficient and Intercept8 Z2 b1 V4 |7 e; S' r4 ]
print('Coefficient: \n', model.coef_) / z9 K- z. T# L. H! K' ?# U3 V print('Intercept: \n', model.intercept_), Z: q4 k- d$ [+ B# X& D9 w
8 ?0 X: W) L. K( v从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。 ; i9 y2 W- [ b% u. [- m1 y & t [/ M+ S% r( u$ g6 w/ J# V" x7 v. P6 m$ `2 i
from sklearn import tree 1 V* i9 R K4 _4 m* `9 j+ A" L. [0 H6 O/ u- Q% V! W ^1 _
+ [% H* Z9 G# L. N! X. s# Create tree object $ ^* Z: x1 }6 C# r. p! `
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini / G) Q! y; e9 O5 z
8 c: ?3 _6 Y# ?0 I5 _# model = tree.DecisionTreeRegressor() for regression 0 p; r+ W z/ g1 ^# ?9 o# e- `8 L+ S/ g! L) N2 F
# Train the model using the training sets and check score , Z* Q/ y& F, Y$ Nmodel.fit(X, y) 6 G: b/ t4 ~3 e. mmodel.score(X, y)3 K. x3 k' _0 ~" z+ f2 L* J
4 w* r/ J+ M; ~6 k1 YKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。, Y z: l' a" S7 B/ }
! | }7 p; c: E" }, o t1 l
在用KNN前你需要考虑到:% }$ [. z6 e+ m! H
+ C( |4 a7 I7 T( ~7 N# c
KNN的计算成本很高5 @7 Y% |, {" a+ W- h# R
$ U* F, L3 \# |& P1 T4 E所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。 # M' `1 w1 ~/ {) n3 j# {% W" Z+ T6 [
在进行KNN前预处理数据,例如去除异常值,噪音等。 1 N& t; t: J9 p1 C- E) T2 N q4 U4 g
#Import Library % X( ]/ f$ I% y6 M2 @+ L+ U, Efrom sklearn.neighbors import KNeighborsClassifier 0 `5 c- R- x% @3 Y4 c7 `- b, k1 D 6 K7 {% u! I8 ?) H$ |: B#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset ' h# _) g5 Z0 |2 c: W8 c, \# Create KNeighbors classifier object model " f4 @( a! l# S ^
$ u; \1 n# x1 P9 RKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 58 C' a+ D% ~, t) g5 M, D3 ?9 o1 }4 l. ?
; [: t9 e1 D: W3 }$ u# Train the model using the training sets and check score ; @; t2 ^3 U; O( N+ n/ I% i3 mmodel.fit(X, y); n. Z) u1 n( K; j7 P1 K' R+ S; A
( n7 T9 T" j9 F
#Predict Output$ n8 f5 e. @2 o1 v; K6 W3 I
predicted= model.predict(x_test) ! A+ C. ^0 u# [( K* m7. K均值算法(K-Means) # a7 g% D1 C/ P这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。6 |, `: `) t% D9 g, b% a9 l
2 @1 m3 A8 n+ v+ F7 s
还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量! 6 w" _% U- T' r* T% A/ j0 P: {9 y: s
4 y, B" T) V5 Y& ]0 \+ n
K均值算法如何划分集群:- {) }$ v) }& o# u0 S
7 L0 W1 ]$ J. G5 P& s4 X * p# o P* [! m# k" l1 h2 A' N, ~, U9 A- z7 l5 f/ B
从每个集群中选取K个数据点作为质心(centroids)。 ! ~/ \8 M5 J: u# g, O* p% n' h' Q3 e
将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。+ `; f7 u$ U1 F0 J
) z4 u; d7 c9 ~) Q
找出新集群的质心,这样就有了新的质心。 ! e# d6 b9 x8 ?6 ~" Z+ U8 N, O1 x ' h5 h3 e: N) y# k5 a5 }重复2和3,直到结果收敛,即不再有新的质心出现。. _# ?1 e9 y- F9 M8 V
' ]. S+ R6 b! J( m5 f5 A* f1 g$ u & Z& y) B% n# ^ ~怎样确定K的值: 4 U7 h: d5 M# L. I , @+ G" p7 ]5 R5 F) ?, L如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。; z8 o6 I# s; I
5 b8 c* {' Z# M我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。 . D3 P6 i5 `& U9 T6 }& x 1 h" f+ o! R0 w3 s# }7 `) W) O9 k/ f1 N( W E
#Import Library9 B& g3 }8 s6 Y! M( c- h9 {
from sklearn.cluster import KMeans8 V/ M( h1 b% t4 s- {
/ w' e6 Z0 l9 |. \# R
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset % _2 [6 c% ?4 S/ ?# Create KNeighbors classifier object model 8 J6 b& A' W8 _8 }
k_means = KMeans(n_clusters=3, random_state=0)% x+ u1 `) {+ F9 `3 x5 X j
R9 \; F0 r7 i+ T4 q
# Train the model using the training sets and check score! n6 z7 W7 J3 ~8 G) |$ W
model.fit(X)8 j K* A" p% a3 u
/ `% c n# Z5 z7 l" s: {
#Predict Output , W4 V' r! k) i9 @+ ^predicted= model.predict(x_test)% t6 W% P2 ^) ?8 j5 e
8.随机森林) D9 j! N) N* n0 n- e
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。! Z" t5 k* J z1 {( q+ c/ v, i
& L9 L9 x$ u% H5 m5 q0 h) t
怎样生成决策树:6 O2 H: _3 h+ t" Z, P9 Y3 o/ d% F
/ {) M( a+ i" X: t( [( H
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。, w- r9 h# J% O9 w
, M' ^9 b) n, z! }如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。, Y' {. L1 D* u5 H# M
& g8 {! j/ O: u! `! @& `每个决策树都最大程度上进行分割,没有剪枝。& E6 w) H( _' O) @# S
4 g9 Q I6 f; S* t. V
#Import Library , @# I1 L3 b9 i9 J# Y- e6 Dfrom sklearn.ensemble import RandomForestClassifier+ q1 k# N0 q6 C
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset, y5 B& L% ^4 O$ {' A
) V0 K5 y7 f0 A) V6 d
# Create Random Forest object% K0 F. t* @% C0 |# W
model= RandomForestClassifier() 8 _" {- k. P. |2 C2 L3 u M1 p' A6 ^4 f! A* B
# Train the model using the training sets and check score , o4 E9 V. B5 T( o) z; N2 Smodel.fit(X, y) 6 H( Y o/ M0 k5 O }, E9 s. E A8 B$ }: e
#Predict Output * O2 Y& |# z) w) ?2 U7 Dpredicted= model.predict(x_test)" @4 L& T1 u9 u. A7 u( \( [; {3 Y
9.降维算法(Dimensionality Reduction Algorithms); _5 W$ m& c2 h' s" V" v
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。 " Z! K( g3 _& o0 i! \& h 1 A# q& B# \' i w. K. L例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。' W1 X" N& ^2 `' D: q1 H* F) `
3 A% B8 W% }+ Z9 y
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。 - Y r% j$ f# D2 t: I. U ' b. Q) U; |" M0 n+ {" y5 Y w9 t# S- W' {! X- n+ T% [/ _4 @/ R
#Import Library* `# @# ^2 o/ r. n6 s" ?/ u1 B
from sklearn import decomposition! ]$ e" N% z2 u9 \3 v; A% U, y2 V
#Assumed you have training and test data set as train and test P1 i" }# k: ~7 J c1 e/ c# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) ; [9 w2 T& ^0 n; `# \# For Factor analysis X0 Q- o) N' H5 }+ W' w; j8 q#fa= decomposition.FactorAnalysis() . C$ l; j' u' b8 Y# Reduced the dimension of training dataset using PCA # Y, a/ q" B# f8 _1 T" Z- ~+ Q/ Z. o% t
train_reduced = pca.fit_transform(train) . T7 L% S% \5 l8 {* }; x) | w! F) m+ i' O/ E( N* X! i
#Reduced the dimension of test dataset ' z2 X. B3 A" y( m; @test_reduced = pca.transform(test) , c" d" m o, Z& [6 @ L% C10.Gradient Boosing 和 AdaBoost9 g( ], |+ v6 T# ~
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。 * `/ h5 B8 P; Q% g$ K8 P8 x r$ k* d. _
#Import Library2 {2 y9 ]9 g: \1 D
from sklearn.ensemble import GradientBoostingClassifier2 Z# m' A3 [$ I' C
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 3 R. L- z$ l( d# Create Gradient Boosting Classifier object" F' w* X7 [! A
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0): L+ V8 C* C4 l& G# u, Z" B1 o
: K1 @* U4 X+ O; b7 ?# Train the model using the training sets and check score% A) P/ ?% K. M" v1 b, i
model.fit(X, y)2 z: Q1 v( f* U+ o
#Predict Output4 i$ r- ]2 S9 B7 u8 t2 ~
predicted= model.predict(x_test)# `- e" g9 O# ^8 h4 m1 Q6 c/ U
GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。 9 B; l' c1 D; |# m; B4 w+ d, Q" c2 z# L6 O3 |; H5 P- w. {0 A
原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386 $ {( G( B) _6 q% b. T% f( X% l———————————————— * e; p# m+ R( r) F% c/ k" c s版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 . Q C5 w. U- x8 {+ Z! p. j' m原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075 5 g' R' x& m) W) s; V B" C# G 0 Z( _+ t4 X5 S8 D ! [+ H( C% A! R4 s