把knn放进来是 knn太短了 直接加上就行了
数和森林可以参考这个
https://www.analyticsvidhya.com/blog/2016/04/complete-tutorial-tree-based-modeling-scratch-in-python/
knn
好邻居法 用最近的k的邻居来表示它的特征 一般用于分类
用一个距离函数 找出已知数据中距离未知事件最近的k个数据,最后按照这k个数据里出现最多的 表示该数据。
代码
from sklearn.neighbors import KNeighborsClassifier
#X,y training dataset ,x_test test dataset
KNeighborsClassifier(n_neighbors=6) # 默认n为5
model.fit(X, y) #训练模型
predicted= model.predict(x_test) #输出预测
Decision Tree
决策树效果很好 可以做non-linear 分类、回归都好用
专有名词
Root Node: 根节点
Splitting: 把节点 2分 3分还是几分
Decision Node: 能够分裂的节点
Leaf/ Terminal Node: 不能继续分裂
Pruning:砍树 去掉子节点 降低树高
小孩玩棒球 树有多种分法 怎么分最重要
怎样 splitting ? 就像对小孩玩棒球 在3种中 怎么选最好的
1Gini Index
Gini index says, if we select two items from a population at random then they must be of same class and probability for this is 1 if population is pure.
就是分的 2个items 要在同一个 class下 如果是纯的(纯度100%) 就是1
1、作用于明确变量 0,1
2、必须2分
3、gini值越高 homogeneity(同质性,差不多就是纯度)越高
4、CART 是 Gini method 一个运用
如何计算gini splitting
1、Calculate Gini for sub-nodes, using formula sum of square of probability for success and failure (p^2+q^2).
计算gini 子节点 sum (成功^2+失败^2) #就计算 平方纯度
2、Calculate Gini for split using weighted Gini score of each node of that split
计算gini 对分割的 用带权重的gini分数 对每一个所分节点
以小孩玩棒球为例
找到哪个spilt 更加homogeneous(就是更纯)
gender:
gini 下的子节点 female = (0.2)(0.2)+(0.8)(0.8)=0.68
gini下的子节点Male = (0.65)(0.65)+(0.35)(0.35)=0.55
带权重的 split= (10/30)*0.68+(20/30)*0.55 = 0.59 (权重w就是 30个学生人数所占比例)
class:
Class IX = (0.43)(0.43)+(0.57)(0.57)=0.51
Class X = (0.56)(0.56)+(0.44)(0.44)=0.51
带权重的 split = (14/30)*0.51+(16/30)*0.51 = 0.51
可以看出 gender分数 > class分数 用gender分好 这个分数就是纯度gender分的更纯
2、Chi-Square (就是卡方检验)
找出 父、子节点的差异 用平方标准差 算出观测的 和期望的 发生率的差异
1、作用于变量 1,0 (success failure)
2、可用于 2分或更多分
3、高的分数 表示 父子差异大
4、Chi-Square 对每个节点计算用公式
5、Chi-square = ((Actual – Expected)^2 / Expected)^1/2
6、CHAID 树
如何计算
1、Calculate Chi-square for individual node by calculating the deviation for Success and Failure both
计算每个节点的 对0,1的偏差 卡方
#就是((Actual -Expected)^2 / Expected)^1/2
2、Calculated Chi-square of Split using Sum of all Chi-square of success and Failure of each node of the split
sum (所有的节点的 0,1的卡方)
以小孩玩棒球为例
gender:
期望值是 5 因为父节点是50%可能性
, Actual – Expected
“Play Cricket” (2 – 5 = -3) “Not play cricket” ( 8 – 5 = 3).
((Actual – Expected)^2 / Expected)^1/2.
在都加起来
class:
差不多意思
5,5开应该是最差的 所以 分数越大越好 Gender 更好
3、Information Gain:
就是单纯套该公式
l(x) = -log p(x)
H = ∑p(x)l(x)
信息增益H 越小越好 (就是5,5开是最差的)
过程例子
Entropy for parent node = -(15/30) log2 (15/30) – (15/30) log2 (15/30) = 1 # 1最差
Female node = -(2/10) log2 (2/10) – (8/10) log2 (8/10) = 0.72
male node, -(13/20) log2 (13/20) – (7/20) log2 (7/20) = 0.93
Entropy for split Gender = Weighted entropy of = (10/30)*0.72 + (20/30)*0.93 = 0.86
Class IX node, -(6/14) log2 (6/14) – (8/14) log2 (8/14) = 0.99
Class X node, -(9/16) log2 (9/16) – (7/16) log2 (7/16) = 0.99.
Entropy for split Class = (14/30)*0.99 + (16/30)*0.99 = 0.99
4、Reduction in Variance
用于回归问题 用标准方差做分裂 值越小越好
处理overfitting
不处理会生成 完全长成树 100%正确但会overfit
处理方法 1、限制树的大小
2、砍树
1、限制树的大小
1、 节点分裂的最小样本(Minimum samples for a node split)
2、节点分裂的最少叶子样本(Minimum samples for a terminal node (leaf))
3、树深 (Maximum depth of tree (vertical depth))
4、叶子最多数目(Maximum number of terminal nodes)
5、最多特征数(Maximum features to consider for split)
2、砍树
一种贪婪算法 一边砍树 一边要求纯度最好
就像汽车行驶
可以选择在小车道 也可以选择在大车后
开车的人一般选择 先去大车道超车 ,在加塞的小车道了
砍树就像加塞 提前去做某些工作
步骤:
1、先让树很深
2、从底部开始 删除叶子 给我们负收益的
3、假设收益 -10 但下一个spilt 给我们 +20收益 这样 就得到了+10
代码
#Import other necessary libraries like pandas, numpy...
from sklearn import tree
#X,y training dataset ,x_test test dataset
# 建树
model = tree.DecisionTreeClassifier(criterion='gini') # 用gini分树 默认gini
# model = tree.DecisionTreeRegressor() ###regression
model.fit(X, y)
model.score(X, y)
#训练模型 给分
predicted= model.predict(x_test)
#预测
Random Forest
“万能灵药” 不知道用什么 用它就对了
对 分类 票数最多的就是结果
对 回归 票数平均就是结果
1.如果训练集中有N种类别,则有随机地放回 选取N个样本。这些样本将组成培养决策树的训练集。
2.如果有M个特征变量,那么选取数m < M,从而在每个节点上随机选取m个特征变量来分割该节点。再在m个中选出最佳spitting。m值在整个建森林过程中保持不变。
3.每个决策树都最大程度上进行分割,没有剪枝。
Random Forest 优势
1、用于 分类 回归都可以
2、可处理 大数量集 在高维度下 可以降维(dimensionality reduction method) 可输出每个维度的重要性 方便
3、可作用于 数据丢失
4、对数据中的错误 可以有平衡作用
5、上述作用 可用于无监督学习中
5、在建森林的过程中 自带一笔 dataset 可以用于 testing 就是 差不多是三分之1 这样 ,就是因为 每次 一个单词没 选到的 概率 是
n−1n
那么最终 如果这个单词没选到 概率就是
(n−1n)n=(1(1+(1n−1)n)=1e
这些就是out of bag 样品
这些样品可以用来做test
代码
from sklearn.ensemble import RandomForestClassifier
#use RandomForestRegressor for regression problem
#X,y training dataset ,x_test test dataset
# 建森林
model= RandomForestClassifier(n_estimators=1000)
#训练
model.fit(X, y)
#输出
predicted= model.predict(x_test)