R语言机器上算法实现

前言

通过前几章,我们的网站曾太中心的成效,接下去就累开展其他的效应,这期并来兑现一个该网站流量分析的工具,统计出是网站每天用户相关数据,不仅使满足了俺们针对流量统计数字的基本要求,并且用重新简短的图片显示方式,让我们看清地落页面热度、点击率信息等等。有矣这想法之后,那怎么落实为,跟着笔者一步步来吧。

先是,需要考虑怎么才能够获得用户访问网站时之有关数据也?我们从不必要自己失去记录这些信息,目前早就生成千上万秋的解决方案,提供捕获这些信息之免费接口,我们只是所以去做客这些接口就好了。

每当众底方案受到,有2款目前凡是较流行的,分别是google
analytics和百度统计。怎么说呢,google的真是行的大牛,不仅充分熟,而且出详实的技巧文档,数据收集过程异常顺畅,但是数量见需要fanqiang(原因你们知道),这块是钢铁伤,一个开之网站没法要求用户还设fanqiang吧,也是由是缘故,让自己忍痛放弃了google
analytics。那只有生一个增选了:百度统计。想比较而言,百度统计的相关技术文档不忍多说,都是泪液,笔者在坑中摸索爬滚打那个遥远,才施明白怎么调用和做客。

方案定下来,因为咱们设看百度统计的怒放API,以后会常调用到外网的各种API,为了磨刀不费砍柴工,我们出一个API的学工具,用来调节。

小结

  本文主要讲了机械上之局部基本概念,还有一对机器上道的基本原理及R语言实现。包括用于分类的机器上道:k近邻,朴素贝叶斯,决策树,规则学习;用于数值预测的机器上道:lasso回归,回归树,模型树,它们都属监督上。下篇文章会说及监控上中的神经网络和支撑于量机,还出另非监督上之一部分方式。
  本文可以看成一个速查和精炼的入门,一些函数只列举了有至关重要的参数,具体的动参数可以透过查看R里面的助获得。另外假如要用于实施,还欲了解一些K折交叉检查,kappa统计量,ROC曲线内容,以对范的习性进行评暨针对性两样之范进行对比。

流量分析工具

有矣端API模拟工具,现在可以生有益之调节我们百度统计接口了。百度统计是怎么抱这些网站用户访问的系信息之也?原理其实深简单,百度针对你的挂号服务提供相同截js代码,其中饱含标识你于百度统计的id。你以网页遭到上加这段代码后,每当用户访问该网站经常,会下蛋充斥这段js脚本,加载了和距离页面的时候,都见面发送一赖呼吁和传递参数,百度统计服务基本之所以捕获到这些信,维护以服务器遭受。调用百度统计API传递您的id,会基于id返回您的网站对诺分析数据。

至于流量统计原理,有趣味详见揭露百度统计以及Google
Analytics的干活原理

线性回归

  回归第一关心一个唯一的以变量(需要预测的价)和一个要多个数值型自变量之间的涉及。

  • 一经光来一个自变量,称为一元线性回归或者简单线性回归,否则,称为多元回归。
  • 原理:对线性参数的估量应用最小二就估计
  • 广义线性回归:它们对准线性模型进行了少数上面的放:通过设定一个连连函数,将应变量的希和线性变量相关联,以及针对误差的分布于出一个误差函数。这些推广允许多线性的章程能够为用于一般的问题。比如逻辑回归好用来针对第二状元分类的结果建模;而泊松回归好针对整型的计数数据开展建模。
  • 优点:迄今为止,它是数值型数据建模最常用之办法;可适用于几有的多少;提供了特点(变量)之间关系之强度和分寸的估量
  • 症结:对数码作出了很强之假设;该型的花样要由使用者事先指定;不可知充分好地拍卖缺失数据;只能处理数值特征,所以分类数据要额外的拍卖;需要有统计学知识来理解模型。
  • LASSO回归算法:LASSO回归的性状是以拟合广义线性模型的而进行变量筛选(只选取针对性因变量有举世瞩目影响之自变量)和复杂度调整(通过参数控制模型复杂度,避免超负荷拟合)。它通过查办最特别似然来拟合广义线性模型,正则化路径是由此正则化参数lambda的值的网格上计算lasso或者弹性网络惩戒,lambda越老对变量较多的线性模型的处力度就更加老,从而最终得到一个变量较少之模型。
  • R代码:
    使R包glmnet中glmnet()函数拟合LASSO回归模型
      glmnet(x, y,
    family=c(“gaussian”,”binomial”,”poisson”,”multinomial”,”cox”,”mgaussian”),
        weights, offset=NULL, alpha = 1, nlambda = 100,
         lambda.min.ratio = ifelse(nobs<nvars,0.01,0.0001),
    lambda=NULL,
         standardize = TRUE, intercept=TRUE, thresh = 1e-07, dfmax =
    nvars + 1,
         pmax = min(dfmax * 2+20, nvars), exclude, penalty.factor =
    rep(1, nvars),
        lower.limits=-Inf, upper.limits=Inf, maxit=100000,
        type.gaussian=ifelse(nvars<500,”covariance”,”naive”),
         type.logistic=c(“Newton”,”modified.Newton”),
         standardize.response=FALSE,
    type.multinomial=c(“ungrouped”,”grouped”))

  x:
输入矩阵,每列表示变量(特征),每行表示一个相向量,也支持输入稀疏矩阵(Matrix中的稀疏矩阵类);
  y:
反应变量,对于gaussian或者poisson分布族,是呼应的量;对于binomial分布族,要求是有限水平的因数,或者个别排的矩阵,第一列是计数或者是比例,第二排是目标向分类;对于因子来说,最后的水准是本字母表排序的归类;对于multinomial分布族,能产生逾两品位的因数。无论binomial或者是multinomial,如果y是向量的话,会强制转化为因子。对于cox分布族,y要求凡鲜列,分别是time和status,后者是次上制变两,1象征死亡,0象征截尾,survival包带的Surv()函数可以生出这么的矩阵。对于mgaussian分布族,y是量化的反应变量的矩阵;
  family:
反应类型,参数family规定了回归模型的档次:family=”gaussian”适用于一维连接为变量(univariate)family=”mgaussian”,适用于多维连续因变量(multivariate),family=”poisson”适用于非负次数为变量(count),family=”binomial”适用于次首位离散因变量(binary),family=”multinomial”适用于多元离散因变量(category)
  weights:
权重,观察的权重。如果反应变量是比例矩阵的话,权重是总计数;默认每个观察权重且是1;
  offset:
包含在线性预测中之和着眼向量同样长度的朝量,在poisson分布族中使用(比如log后底展露时间),或者是于已拟合的范的更定义(将原模型的因变量作为向量放入offset中)。默认是NULL,如果提供了价值,该值也须提供给predict函数;
  alpha: 弹性网络混合参数,0 <= a
<=1,惩罚定义也(1-α)/2||β||_2^2+α||β||_1.其中alpha等于1是lasso惩罚,alpha等于0是ridge(岭回归)的惩罚;
  nlambda:lambda值个数;拟合出n个系数不同的模型
  lambda.min.ratio:lambda的太小价,lambda.max的比例形式,比如整个系数都是0的当儿的卓绝小值。默认值依赖让观察的个数与特色的个数,如果观察个数大于特征个数,默认值是0.0001,接近0,如果观察个数小于特征个数,默认值是0.01。在观察值个数小于特征个数的动静下,非常小的lambda.min.ratio会导致了拟合,在binominal和multinomial分布族性,这个价值不定义,如果讲变异百分比总是1之话程序会自动退出;
  lambda:用户提供的lambda序列。一个独立的用法基于nlambada和lambda.min.ratio来算自己lambda序列。如果提供lambda序列,提供的lambda序列会覆盖这。需谨慎采用,不要提供单个值为lambda(对于CV步骤后底前瞻,应以predict()函数替代)。glmnet依赖让缓慢开始,并且其用于拟合全路线比算计单个拟合更快;
  standardize:对于x变量是否规范的逻辑标志,倾向被拟合模型序列。
系数总是在原来规模返回,默认standardize=TRUE。如果变量已经是同样单位,你也许并无克取想使的标准化结果。
  intercept:是否拟合截距,默认TRUE,或者设置为0(FALSE)
  thresh:坐标下降的消灭域值,每个内部坐标下降一直进行巡回,直到系数更新后底无比酷改变值比thresh值乘以默认变异要稍,默认thresh为1E-7;
  dfmax:在模型中的顶深变量数,对于大气的变量数的范但咱只有待一些变量时得由及意向;
  pmax:限制非零变量的极其老数据;
  exclude:要自模型中祛之变量的目录,等同于一个极其的惩治因子;
  penalty.factor:惩罚因子,分开的惩治因子能够利用至各国一个系数。这是一个数字,乘以lambda来允许不同之抽。对于有变量来说可以是0,意味着不管收缩,默认对整个变量是1,对于列在exlude里面的变量是极度好。注意:惩罚因子是里针对nvars(n个变量)的跟拓展重新调整,并且lambda序列将会晤潜移默化这改变;
  lower.limits:对于每个系数的还小限制的朝量,默认是无穷小。向量的每个值须非正值。也可以以单个值呈现(将会晤再也),或者是(nvars长度);
  upper.limit:对于每个系数的又强克的向量,默认是无穷大;
  maxit:所有lambda值的多寡最要命传递数;
  type.gaussian:支持高斯分布族的有限栽算法类型,默认nvar <
500采用”covariance“,并且保留有中计算的结果。这种方法于”naive”快,”naive”通过对nobs(n个观察)进行巡回,每次内部计算一个结果,对于nvar
>> nobs或者nvar > 500底情状下,后者往往重速;
  type.logistic:如果是”Newton“,会以精确之hessian矩阵(默认),当用的是”modified.Newton“时,只使用hession矩阵的上界,会再度快;
  standardize.response:这个参数时对于”mgaussian“分布族来说的,允许用户标准化应答变量;
  type.multinomial:如果是”grouped”,在多项式系数的变量使用分布lasso惩罚,这样能担保其统统以联名,默认是”ungrouped”。

glmnet返回S3类,”glmnet”,”*”,”*”可以是elnet,lognet,multnet,fishnet(poisson),merlnet
  call:产生这目标的调用;
  a0:截距;
  beta:对于elnet, lognet,
fishnet和coxnet模型,返回稀疏矩阵格式的系数矩阵(CsparseMatrix),对于multnet和mgaussian模型,返回列表,包括各国一样近似的矩阵;
  lambda:使用的lambda值的其实序列;当alpha=0时,最酷之lambda值并无单纯等于0系数(原则及labda等于无穷大),相反以alpha=0.01之lambda,由此导出lambda值;
  dev.ratio:表示出于模型解释的多变的百分比(对于elnet,使用R-sqare)。如果有权重,变异计算会加盟权重,变异定义也2x(loglike_sat-loglike),loglike_sat是饱和模型(每个观察值具有自由参数的范)的log似然。因此dev.ratio=1-dev/nulldev;越接近1证实模型的呈现尤其好
  nulldev:NULL变异(每个观察值),这个定义也2*(loglike_sat-loglike(Null));NULL模型是负截距模型,除了Cox(0
模型);
  df:对于每个lambda的非零系数的多寡。对于multnet这是对此部分近似的变量数目;
  dfmat:仅适用于multnet和mrelnet。一个囊括各级一样类的非零向量数目的矩阵;
  dim:系数矩阵的维度;
  nobs:观察的数量;
  npasses:全部lambda值加和的数目的毕竟的通量;
  offset:逻辑变量,显示模型中是否含有偏移;
  jerr:错误标记,用来警告以及报错(很大部分用于中调整试验)
  而直白显示的结果产生三列,分别是df,%Dev
(就是dev.ratio),lambda是每个模型对应之λ值

predict(object,newx,s=NULL,type=c(“link”,”reponse”,”coefficients”,”nonzero”,”class”),exact=FALSE,offset,…)
  coef(object,s=NULL,exact=FALSE)
  object:glmnet返回的靶子;
  newx:用来预测的矩阵,也足以是系数矩阵;这个参数不克用于type=c(“”coefficents”,”nonzero”);
  s:惩罚参数lambda的价,默认是用来创造模型的满lambda值;
  type:预测值的档次;”link”类型为”binomial”,“multinomial”,”poisson”或者”cov”模型线性预测的值,对于”gaussian”模型给起草合值。”response”类型,对于”binominal“和”multinomial”给拟合的概率,对于”poisson“,给拟合的均值,对于”cox”,给拟合的对立不与;对于”gaussion”,response等同于”link“类型。”coefficients”类型对需要的s值计算系数。注意,对于”binomial”模型来说,结果就对因子对的老二单水平的类归。“class”类型仅仅使用被”binomial”和”multinomial“模型,返回最酷可能的分类标签。”nonzero”类型对每个s中的价返回一个列表,其中带有非0参数的目录;
  exact:这个参数就对用于预测的s(lambda)值不同为原模型的拟合的值时,这个参数起至意向。如果exact=FALSE(默认),预测函数使用线性解释来针对给的s(lambda)值进行展望。这时一个良类似的结果,只是稍微有硌粗糙。如果exact=TRUE,这些不同之s值和拟合对象的lambda值进行sorted和merged,在作出预测之前进行模型的还拟合。在这种情景下,强烈建议提供原始之多少x=和y=作为额外的命名参数为perdict()或者coef(),predict.glmnet()需要提升型,并且期待用于创造接近其的数目。尽管未提供这些额外的参数它吗会见运作的死去活来好,在调用函数中利用嵌套序列非常可能会见半途而废。
  offset:如果应用offset参数来拟合,必须提供一个offset参数来发预计。除了项目”coefficients”或者”nonzero“
  …:可以提供参数其它参数的机制,比如x=when exact=TRUE,seeexact参数。

library(glmnet )
library(psych)

#dummy variable encoding
iris$issetosa <- ifelse(iris$Species=="setosa",1,0)
iris$isversicolor <- ifelse(iris$Species=="versicolor",1,0)
iris_dt <- iris[,-5]
pairs.panels(iris_dt) #scatterplot matrix

统计 1

  pairs.panel画生散点图矩阵,对角线上方显示的是变量之间的相关系数,每个散点图中上椭圆形的靶子称为相关椭圆,它提供平等种变量之间是哪些密切相关的可视化信息。位于椭圆中间的之接触表示x轴变量和y轴变量的均值所确定的触发。两单变量之间的相关性由椭圆的造型表示,椭圆越为牵涉伸,其相关性就越来越强。散点图中绘制的曲线称为局部回归平滑,它代表x轴和y轴变量之间的一般涉及。iris数据画生之散点图矩阵中之相关系数和散点图曲线都可见Petal.Length和Petal.Width有着高之相关性,而由散点图曲线也只是视,似乎Sepal.Length超出一定阈值后,Sepal.Length增加,Petal.Length也多,并且也跟路是setosa或者versicolor也来提到。以Petal.Width作为为变量作线性回归。

library(glmnet )

#dummy variable encoding
iris$issetosa <- ifelse(iris$Species=="setosa",1,0)
iris$isversicolor <- ifelse(iris$Species=="versicolor",1,0)

#divided into training sets and test sets
set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train <- iris_rand[1:105,-c(4,5)]
test <- iris_rand[106:150,-c(4,5)]
train_value  <- iris_rand[1:105,4]
test_value  <- iris_rand[106:150,4]

#lasso
m_lasso <- glmnet(as.matrix(train),train_value,family = "gaussian")

plot(data.frame(df=m_lasso$df,dev.ratio=m_lasso$dev.ratio),type="b",cex=0.6)
coef(m_lasso, s=0.0497000)  #min df

统计 2

统计 3

查变量个数与范解释变异百分比的点图,发现于df=1时既上马和,已经得以说93%的形成。因此取df=1的足讲最老形成的lambda,0.0452800,查看系数发现采用了点儿独特性,其中一个系数大小,并无是我们要之,因此lambda改吧第二独讲最老形成的lambda,0.0497000.
之所以coef取出参数如下
lambda=0.0452800
统计 4

lambda=0.0497000
统计 5
为此选出的lambda值进行展望

pred <- predict(m_lasso,newx=as.matrix(test),s=0.0497000)
summary(pred)
summary(test_value)
cor(test_value,pred)
MAE <- mean(abs(pred - test_value))
mean(abs(mean(train_value) - test_value))

意识预测值和真实值范围非常类似
统计 6
相关系数高
统计 7

MAE(平均绝对误差,反映预测值和真实值的歧异)仅为0.1981803,如果只是用训练集的均值预测的话,MAE高及0.6551746)
统计 8

综合以上的心路标准,说明我们的型预测的正确性。

小结

所以地图显示区域分析功能至此就早已约完成,我们添加图表数据的显示,这样内容更丰富些,最后,我们看下力量:

统计 9

节能贝叶斯分类

  • 原理:基于节约贝叶斯定理,根据先验概率计算预测实例的属不同品种的究竟似然,再以有型的似然除以不同种类似然的以及沾预测实例在某个项目的概率
  • 行使节省贝叶斯算法每个特征必须是分类变量,对于数值型变量,可以拿数值型特征离散化(分段),可以依据直方图查看数据明显的分隔点,如果没明确的分隔点,可以下三区划位数,四分位数,五分位数,分段太少会将要信息丢失
  • 拉普拉斯估价:对于某些从来不曾起的概率为0的,会潜移默化概率的估算,拉普拉斯估价本质上是于概率表的每个计数加上一个较小之高频,这样保证各一样近似吃每个特征来的几率是不零底。
  • 可取:简单、快速、有效;能处理噪声数据以及不够数据;需要为此来训练的事例相对比少,但同样能处理好大方底例证;很容易得到一个预测的量概率值;
  • 症结:依赖让一个常用之错而,即一律的基本点及单身特征;应用在大方数值特征的数额集时并无优;概率的估量值相对于预测的类而言更加不可靠。
  • R代码:
    用维也纳理工大学统计有关出之e1071添加包中的naiveBayes
      m <- naiveBayes(train,class,laplace=0)
    #train:数据框或者隐含训练多少的矩阵,class:包含训练多少列一行的分类的一个因子向量,laplace:控制拉普拉斯估价的一个数值,可以拓展调试看是不是会面增强型性能;该函数返回一个仔细贝叶斯模型对象,该目标会用于预测
       p <- predict(m,test,type=”class”) #m:由函数naiveBays(
    )训练之一个模型
    ,test:数据框或者隐含测试数据的矩阵,包含与用来树分类器的教练多少的一样特征;type:值为”class”或者”raw”,标识预测向量最可能的类别值或者原有预测的几率值

library(e1071)
library(gmodels)

set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train <- iris_rand[1:105,-5]
test <- iris_rand[106:150,-5]
train.label <- iris_rand[1:105,5]
test.label <- iris_rand[106:150,5]

#tranform numerical variable to classified variable
conver_counts <- function(x){
  q <- quantile(x)
  sect1 <- which(q[1] <= x & x<= q[2])
  sect2 <- which(q[2 ]< x & x <= q[3])
  sect3 <- which(q[3]< x & x <= q[4])
  sect4 <- which(q[4]< x & x <= q[5])
  x[sect1] <- 1
  x[sect2] <- 2
  x[sect3] <- 3
  x[sect4] <- 4
  return(x)
}
train <- apply(train,2,conver_counts)

#naiveBayes
m <- naiveBayes(train,train.label,laplace=1)
pred <- predict(m,test,type="class") 

#comfusion matrix 
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)

统计 10

足见对第一像样(setosa)分类达标预计错误率很高,这说不定反映了廉洁勤政贝叶斯算法的缺点,对于拍卖大量数值特征数据集时连无可以

报名Tongji API数据导出

 现在咱们特别有利的当百度统计中翻各种统计数据了,比如流量分析、来源解析、访问分析、转化分析等等,接下要取得这些数量,来移植到我们友好之网站受来。百度提供了Tongji
API,我们可调用API来查询好网站的辨析数据,从而更组织增加的解析视图了。

苟拜Tongji API,需要提供一个token值,这个要开展申请,在
百度统计–>管理–>其他装置–>数据导出服务
中,请求开通,开通后百度统计会提供被你一个token字符串,以后用此token就好看Tongji
API。Tongji
API具体的伸手格式说明详见:百度统计出平台

遵我们需要请站点列表,使用API模拟工具,请求类型POST,url地址:https://api.baidu.com/json/tongji/v1/ReportService/getSiteList,这里注意请求的data参数格式应该如下:

1 {
2     "header": {
3         "account_type": 1,
4         "password": "<密码>",
5         "token": "<token>",
6         "username": "<用户名>"
7     },
8     "body": {}
9 }

输入百度统计的用户称及密码及拜使的token,即可正常访问我们的注册之兼具站点,这里我们好拿到站点的site_id(也得经过百度统计页面查看),后面要该站点的解析数据会因此到。

RIPPER算法

  对于复杂的任务,只考虑单个规则可能过于简短,考虑多独要素的还扑朔迷离的规则学习算法可能会见起因此,但也可能用会面转换得更为难知晓。早期的规则学习算法速度迟滞,并且对噪声数据往往无确切,后来出现增量减少误差修剪算法(IREP),使用了变通复杂规则之预剪枝和晚剪枝方法的重组,并以案例从总体数集分离之前进行修理。虽然就提高了性能,但是要决定树表现的双重好。直到1995年起了再增量修剪算法(RIPPER),它对IREP算法进行改善后再生成规则,它的特性和核定树相当,甚至超过决策树。

  • 原理:可以笼统的喻也一个老三步过程:生长,修剪,优化。生长过程采用独立设治的术,对规则贪婪地抬高条件,直到该规则能够一心分开出一个多少子集或者没性能用于私分。与仲裁树类,信息增益准则而用于确定下一个分的性能,当多一个特指的规则而熵值不再减少时,该规则需要马上修剪。重复第一步和第二步,直到上一个停准则,然后,使用各种探索法对全部的平整进行优化。
  • 瑜:生成易于明的、人类可读之条条框框;对天意据集和噪音数据中;通常比较决策树出的模型更简短
  • 短:可能会见导致违反常理或这专家知识的规则;处理数值型数据或许无绝精彩;性能有或不使复杂的模型
  • R代码:
    采取R包RWeka中JRip()函数,是基于Java实现的RIPPER规则学习算法
      m<JRip(class ~ predictors,data = my data)
    #class:是mydata数据框中需要预测的那一列;predictors:为一个R公式,用来指定mydata数据框中因故来拓展展望的特点;data:为带有class和predictors所求的数量的数据框;该函数返回一个RIPPER模型对象,该对象能够用于预测。
      p <- predict(m , test)
    #m:由函数JRip()训练的一个型;test:一个涵盖测试数据的数据框,该数据框和用来创造分类器的教练多少有一致的特征;该函数返回一个蕴含预测的类别值的向量。

library(RWeka)
library(gmodels)

set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train <- iris_rand[1:105,]
test <- iris_rand[106:150,-5]
test.label <- iris_rand[106:150,5]

m <- JRip(Species ~ .,data=train)
pred <- predict(m,test)
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)

统计 11
这次以了三单规则,(Petal.Width >= 1.8也virginica ,Petal.Length
>= 3也versicolor,其它为setosa
统计 12
看得出虽然多了平整可连不曾提高型的特性

API模拟工具

  • 独立给API模拟工具增加一个菜单项,菜单管理–>新增菜单,增加一个根节点菜单下之一个子菜单:“工具箱”。以后有常用之开发工具菜单,就停放该目录,然后于“工具箱”菜单下,再新建一个子菜单:“API模拟”。
  • 那C#遭怎么调用远程API方法吗,一般用HttpClient可以看,这里我们有点更装进一下,分为Get请求(传递url参数)和Post请求(传递url和content参数):

    1 public static class HttpClientExtensions
    2 {
    3 ///

    4 /// Get请求API
    5 ///

    6 /// 7 /// 8 /// 9 /// 10 ///
    11 public static async Task HttpGetAsync(this HttpClient client, string url)
    12 {
    13 //初始化内容
    14 var responseMessage = await client.GetAsync(url);
    15 if (responseMessage.IsSuccessStatusCode)
    16 {
    17 return await responseMessage.Content.ReadAsStringAsync();
    18 }
    19 else
    20 {
    21 return $”访问API地址:{url}出错,错误代码:{responseMessage.StatusCode},错误原因:{responseMessage.ReasonPhrase}”;
    22 }
    23 }
    24
    25
    26 ///

    27 /// Post请求API
    28 ///

    29 /// 30 /// 31 /// 32 /// 33 ///
    34 public static async Task HttpPostAsync(this HttpClient client, string url, string jsonValue)
    35 {
    36 //初始化内容
    37 var content = new StringContent(jsonValue, Encoding.UTF8, “application/json”);
    38
    39 var responseMessage = await client.PostAsync(url, content);
    40 if (responseMessage.IsSuccessStatusCode)
    41 {
    42 return await responseMessage.Content.ReadAsStringAsync();
    43 }
    44 else
    45 {
    46 return $”访问API地址:{url}出错,参数:{jsonValue},错误代码:{responseMessage.StatusCode}
             ,错误原因:{responseMessage.ReasonPhrase}”;
    47 }
    48 }

  • 参考达亦然章节的内容遭,我们用Api的连锁配置,比如url地址,url请求类型,参数等等,都布置到json文件中,并定义相应的数据结构MyRequest。后续依赖注入IOptions<MyRequest>
    myRequest即可访问。

  • Areas/Tools/Controllers创建对应之控制器ApiSimulatorController

  • InvokApi方法:根据读取的Api请求类型,想远程API服务商发送请求并传递参数,返回json格式给UI端;

  • Index方法:根据用户以下拉框中精选的Api,切换显示Api相关消息;

    1 [Area(“Tools”)]
    2 public class ApiSimulatorController : AppController
    3 {
    4 private readonly MyRequest _myRequest;
    5
    6 public ApiSimulatorController(IOptions myRequest)
    7 {
    8 _myRequest = myRequest.Value;
    9 }
    10
    11 ///

    12 /// API模拟主页
    13 ///

    14 /// 15 ///
    16 public IActionResult Index(string selectedApiCode = null)
    17 {
    18 UpdateDropDownList(selectedApiCode);
    19 if (selectedApiCode == null)
    20 {
    21 return View(“Index”, new ApiRequest());
    22
    23 }
    24 var selectedApi = _myRequest.ApiRequests.FirstOrDefault(s => s.ApiCode == selectedApiCode);
    25 if (selectedApi != null && selectedApi.Methord == “POST”)
    26 selectedApi.ApiDatas = selectedApi.ApiDatas.ToJsonString();
    27 return View(“Index”, selectedApi);
    28 }
    29
    30 ///

    31 /// 调用API
    32 ///

    33 /// 34 ///
    35 public async Task InvokApi(ApiRequest request)
    36 {
    37 var hc = new HttpClient();
    38
    39 if (request.Methord == “GET”)
    40 {
    41 var getUrl = request.Url + “?”;
    42 foreach (var para in request.ApiParas)
    43 {
    44 getUrl += “&” + para.ParaName + “=” + para.ParaValue;
    45 }
    46
    47 ViewBag.SendContent = getUrl;
    48 ViewBag.ReturnResult = (await hc.HttpGetAsync(getUrl)).ToJsonString();
    49 }
    50 else if (request.Methord == “POST”)
    51 {
    52 if (!string.IsNullOrEmpty(request.ApiDatas))
    53 {
    54 ViewBag.SendContent = request.Url;
    55 ViewBag.ReturnResult = (await hc.HttpPostAsync(request.Url, request.ApiDatas)).ToJsonString();
    56 }
    57 else
    58 {
    59 ModelState.AddModelError(string.Empty, “请输入Json格式请求参数”);
    60 }
    61 }
    62 else
    63 {
    64 ModelState.AddModelError(string.Empty, “请求方式非法”);
    65 }
    66
    67 UpdateDropDownList(request.ApiCode);
    68 return View(“Index”, request);
    69 }
    70
    71 ///

    72 /// 初始化下拉选择框
    73 ///

    74 private void UpdateDropDownList(string selectedApiCode = null)
    75 {
    76 List listApiName = new List();
    77 foreach (var request in _myRequest.ApiRequests.Select(s => new { s.ApiName, s.ApiCode }))
    78 {
    79 listApiName.Add(new SelectListItem
    80 {
    81 Value = request.ApiCode,
    82 Text = request.ApiName,
    83 Selected = request.ApiCode == selectedApiCode
    84 });
    85 }
    86 ViewBag.ApiCodes = listApiName;
    87 }
    88 }

Areas/Tools/Views创建对应之视图Index

 1 <div class="form-group">
 2     <label asp-for="ApiCode">API名称:</label>
 3     <select asp-for="ApiCode" class="form-control input-sm select2" asp-items="ViewBag.ApiCodes">
 4         <option value="">-- 请选择 --</option>
 5     </select>
 6 </div>
 7 <div class="form-group">
 8     <label asp-for="Url">API地址:</label>
 9     <input asp-for="Url" class="form-control input-sm" readonly>
10 </div>
11 <div class="form-group">
12     <label asp-for="Methord">请求方式:</label>
13     <input asp-for="Methord" class="form-control input-sm" readonly>
14 </div>
15 <div class="form-group">
16     <label for="params" class="">请求参数:</label>
17     @if (Model.Methord == "GET")
18     {
19         <div style="overflow-x:auto;">
20             <table class="table table-bordered table-striped table-condensed" id="params">
21                 <thead>
22                     <tr>
23                         <td>参数名</td>
24                         <td>类型</td>
25                         <td>是否必填</td>
26                         <td>说明</td>
27                         <td>值</td>
28                     </tr>
29                 </thead>
30                 <tbody>
31                     @for (var i = 0; i < Model.ApiParas.Count(); i++)
32                     {
33                         <tr>
34                             <td>
35                                 @Model.ApiParas[i].ParaName
36                                 @Html.TextBoxFor(a => a.ApiParas[i].ParaName,
37                                new { @class = "form-control input-sm", type = "hidden" })
38                             </td>
39                             <td>
40                                  @Model.ApiParas[i].ParaType
41                                 @Html.TextBoxFor(a => a.ApiParas[i].ParaType,
42                                new { @class = "form-control input-sm", type = "hidden" })
43                             </td>
44                             <td>
45                                 @(Model.ApiParas[i].Required ? "是" : "否")
46                                 @Html.TextBoxFor(a => a.ApiParas[i].Required,
47                                new { @class = "form-control input-sm", type = "hidden" })
48                             </td>
49                             <td>
50                                 @Model.ApiParas[i].Description
51                                 @Html.TextBoxFor(a => a.ApiParas[i].Description,
52                                new { @class = "form-control input-sm", type = "hidden" })
53                             </td>
54                             <td>
55                                 @Html.TextBoxFor(a => a.ApiParas[i].ParaValue,
56                                new { @class = "form-control input-sm" })
57                         </td>
58                     </tr>
59                     }
60                 </tbody>
61             </table>
62         </div>}
63     else if ((Model.Methord == "POST"))
64     {
65         @Html.TextAreaFor(m => m.ApiDatas, 
66        new { @class = "form-control", rows = "8", placeholder = "输入Json格式 ..." })
67     }
68 </div>
69 <button type="submit" class="btn btn-success"><i class="fa fa-send-o margin-r-5"></i>发送请求</button>

json文件中增加“手机号码归属地”、“百度统计”相关API的布置,我们来测试一下:

统计 13

回归树及模型树
  • 决定树用于数值预测分为两近似,第一近乎称为回归树,第二接近称为模型树。
  • 回归树作为分类回归树的一律片段引入,回归树并不曾使线性回归的道,而是根据到达节点的案例之平均值进行前瞻。
  • 型树,比回归树后几年引入,但是也许功能更强。模型树和回归树为大致相同的法门生长,但是在每个叶节点,根据达该节点的案例建立多元线性回归模型。根据叶节点的数据,一蔸模型树可能会见成立几十只还几百独这样的型,这说不定会见要模型树更加难理解,但便宜是她或能立一个越规范的范。
  • 优点:将决策树的独到之处和数值型数据建立模型的力相结合;能活动选择特征,允许该方法以及大量特性并行使;不需使用者事先指定模型;拟合某些项目的数目可能会见比线性回归好得多;不要求用统计的知来说明模型。
  • 缺点:不像线性回归那样时常因此;需要大量之训多少;难以确定单个特征对结果的完好均影响;可能比较回归模型更难以讲。
  • 规律:用于数值预测的决策树的立艺术和用于分类的决策树的树艺术大致相同。从根节点开始,按照特征使用分而治之的策略对数码进行分,在展开同样差私分后,将见面造成数据最大化的净匀增长。而当分拣核定树中,一致性(均匀性)是由熵值来度量的,而对数值型的数目是勿定义之,对于数值型决策树,一致性可以经统计量(比如方差、标准差或者平均绝对不是)来度量。不同的裁定树生算法,一致性度量可能会见迥然不同,但原理是基本相同的。
  • 如出一辙种普遍的细分标准是正统不是减少,就是原始值的科班不一减去分割后未同类的数额加权后底业内不一,这里的加权就是此类的数据比达究竟的数量。决策树已发育后,假如一个案例用特征B进行划分,落入某平组B1备受,那么该案例之预测值将取B1组的平均值。模型树要多倒相同步,使用落入B1组的训案例与落入B2组的教练案例,建立一个相对于任何特征(特征A)的线性回归模型。
  • R代码:
      于R包rpart(递归划分)中提供了例如CART(分类回归树)团队受到所讲述的不过保险的回归树的落实,
      m.rpart <- rpart(dv ~ iv, data = mydata) #dv 是mydata
    数据框中需要建模的以变量;iv
    为一个R公式,用来指定mydata数据框中之自变量;data:为带有变量dv和变量iv的数据框
      p <- predict(m,test,type=c(“vector”, “prob”, “class”,
    “matrix”))
    #m是有函数rpart训练之一个型;test一个蕴含测试数据的数据框,该数据框和用来确立模型的数目颇具相同之表征;type:给定返回的预测值的花色,prob返回预测的概率。matrix返回矩阵的形式包括各的票房价值。class返回树的归类。否则回一个向量的结果。
      可以采取R包rpart.plot中rpart.plot函数对回归树结出可视化。
      时型树被最为先进的算法是M5’算法,可以通过R包Rweka中M5P函数实现;
      m <- M5P(dv ~ iv, data = mydata) #dv 是mydata
    数据框中需要建模的为变量;iv
    为一个R公式,用来指定mydata数据框中的自变量;data:为涵盖变量dv和变量iv的数据框
      p <- predict(m,test)
    #m是有函数rpart训练之一个型;test一个带有测试数据的数据框,该数据框和用来建立模型的数据颇具同样之性状

library(rpart)
library(RWeka)
library(rpart.plot)

#dummy variable encoding
iris$issetosa <- ifelse(iris$Species=="setosa",1,0)
iris$isversicolor <- ifelse(iris$Species=="versicolor",1,0)

#divided into training sets and test sets
set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train_dt <- iris_rand[1:105,-5]
test <- iris_rand[106:150,-c(4,5)]
test_value  <- iris_rand[106:150,4]

#rpart
m.rpart <- rpart(Petal.Width ~ Sepal.Length+Sepal.Width+Petal.Length+issetosa+isversicolor,data = train_dt)
summary(m.rpart)
rpart.plot(m.rpart)
pred <- predict(m.rpart,test)
cor(test_value,pred)
mean(abs(pred - test_value)) #rpart MAE
mean(abs(mean(train_dt$Petal.Width) -  test_value)) #mean MAE

#M5P
m.M5P <- M5P(Petal.Width ~ Sepal.Length+Sepal.Width+Petal.Length+issetosa+isversicolor,data = train_dt)
summary(m.M5P)
pred <- predict(m.M5P,test)
cor(test_value,pred)
mean(abs(pred - test_value)) #rpart MAE
mean(abs(mean(train_dt$Petal.Width) -  test_value)) #mean MAE

回归树的结果如下
统计 14
rpart.plot结果
统计 15

  相关性到达0.9797762,回归树(MAF0.1242998)明显比一直用全值预测(MAF0.7255238)更仿佛被实际的Petal.Width
模型树的结果如下
统计 16

  相关系数到达0.9714331,MAF0.1410668,在这模型树中,只来一个根节点,相应建立了一个线性模型,直接用Sepal.Length
,Sepal.Width
,Petal.Length三个特点进行展望,和lasso回归模型一样,特征前面的系数表示该特征对Petal.Width的清静影响,注意,这里的都影响是因当当前节点是线性模型中之全影响,在是线性模型中,每多某些Sepal.Width和Petal.Length,Petal.Width都见面加,而系数小于0的Sepal.Length
,意味着每增加某些Sepal.Length,Petal.Width就会缩减。从结果可以视,在这案例被,模型树没回归树的功用好。
  此处模型树于从来不成形多个培训节点的状况下,只是针对特色做了线性回归,MAF达到0.1410668,和前对数据作线性回归之lasso模型结果(MAF0.1981803)相比,貌似做的复好,但实在前的lasso回归模型我们限制了特征值个数来避免了拟合,如果多特征值数量及调动labda参数,一样可以直达比较粗的MAF。

注册百度统计

懂得了规律,那首先第一步我们报了名百度统计用户。注册就后,我们找到
代码管理–>代码获取,将百度统计帮你自动生成好之js脚本复制过来,粘贴到site.js文件中。由于_layout母版页引用了site.js文件,这样的话,网站域名下有的用户访问,都见面让统计。

统计 17

设置完百度统计的代码,发布网站先后,可以就此百度统计中代码检查,看看自己统计代码来没来让正确的装,如果安成功,估计20分钟后,就足以于百度统计中查网站的顾情况了。当然,你吗可以增长多只域名之网站。

 统计 18

决策树

  • 原理:以树形结构建立模型。使用同样栽名叫递归划分的探索法。这种办法一般称为分而治之,因为她以特色的值将数据说明为有着相似类的比小的子集。从代表任何数据集的数目结点开始,该算法选择最好能预测目标类的特性,然后,这些案例用吃分到即无异风味的莫同值的组中,这同操形成了第一组树枝。该算法继续分而治之其他结点,每次挑最佳的候选特征,直到上停止的科班。如果一个节点停止,它或许有所下列情形:节点上独具(几乎所有)的案例都属同一类,没有剩余的特色来分辩案例之间的区分,决策树已经达到了先期定义之轻重缓急限制。
  • C5.0算法,时最好知名的表决树算法之一,单线程版本的源代码是堂而皇之之,R中发生编制好的该次。C5.0算法都变成转变决策树的行业标准,因为她适用于大部分型的问题,并且可一直用。与另先进的机上型(神经网络和支撑于量机)相比,一般呈现的几同样,并且还易于了解以及布置
  • 选取最佳的撤并,需要树立分割的标准,有消息增益,基尼系数,卡方统计量,和增益比,C5.0算法使用信息增益
  • 修决策树:如果决定树增长了那个,将会要决策过于具体,模型将见面过分拟合训练多少,解决这题目之相同栽艺术是如达标一定数额的裁定,或者决定节点才含微量底案例,我们便止住树之增长,这叫提前停止法,或者预剪枝决策树法。分为预剪枝(提前确定树的深浅)和晚剪枝(一旦培养生的过死,就依据节点处的错误率使用修剪准则将决策树减少到再次适用的分寸,通常较预剪枝更有效)。
  • 由适应加强算法:进行过多不好尝试,在决策树中是立多决策树,然后这些决定树通过投票表决的法子呢每个案例选择最佳的分类。
  • 长:一个适用于大部分问题的通用分类器;高度自动化的上过程,可以拍卖数值型数据、名义特征与短斤缺两数据;只使用最要害之特征;可以用来只有相对较少教练案例之数据还是有相当多训练案例之数;没有数学背景啊不过讲一个型的结果(对于比较粗的培养);比其它复杂的型更实用
  • 症结:决策树模型在根据所有大量档次的特性进行剪切时频繁是发生偏的;很轻过于拟合或者未可知尽拟合模型;因为依靠让轴平行分割,所以当对有些干起模型时见面发生窘迫;训练多少中的小变化或者造成决策逻辑的比充分的变迁;大之决定树可能麻烦掌握,给有之裁定可能看起违反直觉。
  • R代码:
    使用R包C50的函数C5.0
      m <- C5.0(train,class,trials=1,costs=NULL)
    #train:一个涵盖训练多少的数据框;class:包含训练多少列一行的分类的一个因子;trials:为一个只是卜数价值,用于控制打适应加强循环的次数(默认值为1),一般用10,因为研究表明,这会减低关于测试数据大约25%的概率;costs:为一个可选矩阵,用于受有与各种类型错误相对应之基金,和混淆矩阵稍微不同,行用来代表预测值,列用来表示实际值);函数返回一个C5.0模型对象,该对象能够用于预测
      p <- predict(m,test,type=”class”)
    #m:有函数C5.0()训练之一个模;test:一个蕴含训练多少的数据框,该数据框和用来创造分类其的多少框有同样的特性;type:取值为”class”或者”prob”,表识预测是极端可能的类别值或者是原始的展望概率;该函数返回一个向量,根据参数type的取值,该向量含有预测的类别值或者原有预测的概率值

library(C50)
library(gmodels)

set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train <- iris_rand[1:105,-5]
test <- iris_rand[106:150,-5]
train.label <- iris_rand[1:105,5]
test.label <- iris_rand[106:150,5]

#C50
m <- C5.0(train,train.label,trials = 10)
pred <- predict(m,test,type="class") 

#comfusion matrix 
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)

统计 19

地段分布数据获得

百度统计提供的数据类型很多,我们选择其中一个来试下效果。比如我们用获得访问网站用户之所在信息,不同省份的用户访问情况。

  • 运API模拟工具调试:请求类型POST,url地址:https://api.baidu.com/json/tongji/v1/ReportService/getData,请求的data参数格式如下:

    1 {
    2 “header”: {
    3 “account_type”: 1,
    4 “password”: “<密码>“,
    5 “token”: ““,
    6 “username”: “<用户名>”
    7 },
    8 “body”: {
    9 “site_id”: <站点id>,
    10 “method”: “visit/district/a”,
    11 “start_date”: “30daysago”,
    12 “end_date”: “today”,
    13 “metrics”: “pv_count,pv_ratio,visit_count,visitor_count,new_visitor_count,new_visitor_ratio,
                  ip_count,bounce_ratio,avg_visit_time,avg_visit_pages,trans_count,trans_ratio”,
    14 “order”: “pv_count,desc”,
    15 “max_results”: 0
    16 }
    17 }

可以看,正常返回按照不同省份区域的网站统计数据。

兑现控制器逻辑:按照点提供的json格式,配置到json文件中,并定义MyRequest对象,映射我们有着的API请求,MyRequest存放的是持有API请求的布局信息,通过API请求的id,加载不同的API配置信息。Areas/Tools/Controllers创建对应之控制器SiteAnalyticsController,主要实现GetVisitDistrictAnalytics方法,用来冲日限定,获取相应的区域分析json数据:

 1 [Area("Tools")]
 2 public class SiteAnalyticsController : AppController
 3 {
 4     private readonly IList<ApiRequest> _requests;
 5 
 6     public SiteAnalyticsController(IOptions<MyRequest> myRequest)
 7     {
 8         _requests = myRequest.Value.ApiRequests;
 9     }
10 
11     public IActionResult Index()
12     {
13         return View();
14     }
15 
16     /// <summary>
17     /// 获取百度访客区域统计数据
18     /// </summary>
19     /// <returns></returns>
20     public async Task<JsonResult> GetVisitDistrictAnalytics(string startDate, string endDate)
21     {
22         var hc = new HttpClient();
23         var request = _requests.FirstOrDefault(s => s.ApiCode == "BaiduGetVisitDistrict");
24         var data = request.ApiDatas.Replace("30daysago", startDate).Replace("today", endDate);
25         return Json(await hc.HttpPostAsync(request.Url, data));
26     }
27 
28     /// <summary>
29     /// 获取百度趋势分析数据
30     /// </summary>
31     /// <returns></returns>
32     public async Task<JsonResult> GetTrendAnalytics(string startDate, string endDate)
33     {
34         var hc = new HttpClient();
35         var request = _requests.FirstOrDefault(s => s.ApiCode == "BaiduGetTrend");
36         var data = request.ApiDatas.Replace("30daysago", startDate).Replace("today", endDate);
37         return Json(await hc.HttpPostAsync(request.Url, data));
38     }
39 }

机械上算法

区域分析显示

产生矣区域分析的数目,接下去考虑而怎么亮。

  • 我们计划各个省份的访问量,可以经过地图展现,根据实际访问量的小,通过颜色之浓度表现;
  • 表的形式,具体显示不同省份的访问量和占比较;
  • 柱状图的款型,显示最近7上之访问量趋势;

地图展现,采用jvectormap插件,它是矢量地图,且发生好的API,还是很好用的,具体运用办法,推荐访问官网:http://jvectormap.com/

Areas/Tools/Views创建视图Index:

 1 <!-- 分布地图 -->
 2 <div class="col-md-6 col-sm-6">
 3     <div class="box-body">
 4         <div id="map-markers" class="text-center" style="height: 420px;">
 5             <div>浏览量地域分布</div>
 6         </div>
 7     </div>
 8 </div>
 9 <!-- 分布表格 -->
10 <div class="col-md-4 col-sm-4" style="height: 440px; overflow: auto;">
11     <table class="table table-bordered" id="districtTable">
12         <tbody>
13             <tr>
14                 <th style="width: 10px">#</th>
15                 <th>省份</th>
16                 <th>浏览量(PV)</th>
17                 <th>占比</th>
18             </tr>
19         </tbody>
20     </table>
21 </div>
22 <!-- 近一周统计 -->
23 <div class="col-md-2 col-sm-2">
24     <div class="pad box-pane-right bg-green" style="min-height: 280px">
25         <div class="description-block margin-bottom" id="trend_pv_count">
26             <div class="sparkbar pad" data-color="#fff"></div>
27             <h5 class="description-header"></h5>
28             浏览量(PV)
29         </div>
30         <div class="description-block margin-bottom" id="trend_visitor_count">
31             <div class="sparkbar pad" data-color="#fff"></div>
32             <h5 class="description-header"></h5>
33             访客数(UV)
34         </div>
35         <div class="description-block" id="trend_ip_count">
36             <div class="sparkbar pad" data-color="#fff"></div>
37             <h5 class="description-header"></h5>
38             IP数
39         </div>
40         <div class="description-block" id="trend_avg_visit_time">
41             <div class="sparkbar pad" data-color="#fff"></div>
42             <h5 class="description-header"></h5>
43             平均访问时长
44         </div>
45     </div>
46 </div>

SiteAnalytics.js中,定义jvectormap显示样式,动态获取区域分析数据后, 设置数据集mapObject.series.regions[0].setValues(visitorsData);

 1 var options = {
 2     map: 'cn_mill',
 3     backgroundColor: 'transparent',
 4     regionStyle: {
 5         initial      : {
 6         fill            : 'rgba(210, 214, 222, 1)',
 7         'fill-opacity'  : 1,
 8         stroke          : 'none',
 9         'stroke-width'  : 0,
10         'stroke-opacity': 1
11       },
12       hover        : {
13         'fill-opacity': 0.7,
14         cursor        : 'pointer'
15       },
16       selected     : {
17         fill: 'yellow'
18       },
19       selectedHover: {}
20     },
21     series: {
22         markers: [{
23             attribute: 'fill',
24             scale: ['#C8EEFF', '#0071A4'],
25             normalizeFunction: 'polynomial',
26             values: [408, 512, 550, 781],
27             legend: {
28                 vertical: true
29             }
30         }],
31         regions: [
32             {
33                 scale: ['#ebf4f9', '#92c1dc'],
34                 normalizeFunction: 'polynomial'
35             }
36         ]
37     },
38     onRegionLabelShow: function (e, el, code) {
39         var html = '';
40         html += '<div style="width:120px;">';
41         html += '<div style="border-bottom:1px solid;padding-bottom:5px;">' + el.html() + '</div>';
42         html += '<div style="margin-top:5px;"><i class="fa fa-circle text-success margin-r-5"></i>浏览量(PV)';
43         if (typeof visitorsData[code] != 'undefined') {
44             html += visitorsData[code];
45         } else {
46             html += 0;
47         }
48         html += '</div>';
49         html += '<div style="margin-top:5px;"><i class="fa fa-circle text-primary margin-r-5"></i>占比';
50         if (typeof pecentData[code] != 'undefined') {
51             html += pecentData[code];
52         } else {
53             html += 0;
54         }
55         html += ' %</div>';
56         el.html(html);
57     }
58 }
59 
60 $('#map-markers').vectorMap(options);

版权声明:本文也博主原创文章,转载请注明出处

参考资料

Brett Lantz:机器上及R语言
薛毅,陈立萍: 统计建模与R软件(下册)
侯澄钧:热门数码挖掘模型应用入门(一): LASSO :
https://cosx.org/2016/10/data-mining-1-lasso
slade_sha的博客 Lasso算法理论介绍
:http://blog.csdn.net/slade_sha/article/details/53164905

展望数值型数据

规则学习分类

  • 原理:规则学习算法使用了千篇一律种叫做独立而治之的探索法。这个历程包括确定训练多少被蒙一个案例子集的平整,然后还从剩余的数码被分离有该分区。随着规则之长,更多的数据子集会于分别,直到满数据集都被覆盖,不再有案例残留,独立而治之和决策树的分而治之区别很有些,决策树的每个决策节点会遭受过去决策历史之熏陶,而规则学习不有这样的垂。随着规则之加,更多的数据子集会于分手,知道合数据集都被盖,不再发生案例为封存

机械上一般步骤

  • 收集数据,将数据转发为顺应分析的电子数码
  • 探索与准备数据,机器上着众多工夫花在多少探索中,它一旦上学还多的多寡信息,识别它们的薄区别
  • 因数据训练模型,根据你若读书啊的考虑,选择你要使用的同一种要又算法
  • 讲评模型的属性,需要依据一定的验专业
  • 改良模型的性质,有时候要运用还高级的办法,有时候需要更换模型

kNN(k-Nearest Neighbors,k近邻)

  • 规律:计算距离,找到测试数据的k个近邻,根据k个近邻的归类预测测试数据的分类
  • 运用k近邻需要以逐一特征转换为一个业内的界定(归一化处理),可以用min-max标准化(所有值落在0~1范围,新数据=(原数-最小值)/(最深价值-最小值)),也得以应用z-score
    标准化(新数据=(原数-均值)/标准差)。
  • 对此名义变量(表示项目),可以进行哑变量编码,其中1象征一个档,0代表其余门类,对于n个类别的名义变量,可以用n-1单特点进行哑变量编码,比如(高,中,低),可以就此强、中简单类的哑变量表示即三好像(高:1凡是,0
    其它,中:1凡,0,其它)
  • 可取:简单且使得,对数据分布没有要求,训练等很快;
  • 缺陷:不生模型,在发现特征之间的涉及之能力有限,分类等很缓慢,需要大量底内存,名义变量和缺乏数据要格外处理
  • R代码:
    运用class包的knn函数,对于测试数据遭到之各级一个实例,该函数使用欧氏距离标识k个近邻,然后选出k个近邻中大部所属之非常看似,如果票数相等,测试实例会于轻易分配。
       dt_pred <- knn(train = dt_train,test = dt_test,class =
    dt_train_labels,k = 3)
    #train:一个含有数值型训练多少的数据库;test:一个饱含数值型测试数据的数据框;class训练多少列一行分类的一个因子变量;k:标识最近邻数据的一个整数(通常取实例数的平方根);
    该函数返回一个向量,该向量含有测试数据框中每一行的预测分类
      尽管kNN是并无展开任何学习的简单算法,但是可能处理及其复杂的任务,比如识别肿瘤细胞的疙瘩。
  • 本着R自带iris数据用kNN进行训练、预测并跟事实上结果比

llibrary(class)
library(gmodels)

#prepare data
set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
iris_z <- as.data.frame(scale(iris_rand[,-5])) #z score normalize
train <- iris_z[1:105,]
test <- iris_z[106:150,]
train.label <- iris_rand[1:105,5]
test.label <- iris_rand[106:150,5]

#kNN
pred <- knn(train,test,train.label,k=10)

#comfusion matrix 
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)

统计 20
  这个结果显示kNN对测试数据全预计是

发监控上算法

用于分类:k近邻,朴素贝叶斯,决策树,规则学习,神经网络,支持为量机
用于数值预测:线性回归,回归树,模型树,神经网络,支持为量机

任凭监控上算法

用以模式识别(数据中关系的紧密性):关联规则
用来聚类:k均值聚类

  机器上的钻领域是发明计算机算法,把多少变化为智能行为。机器上及多少挖掘的区分可能是机上侧重于行一个都知晓之职责,而数据发掘是当生数据遭到检索出价的事物。

单规则(1R)算法
  • ZeroR,一个规则学习算法,从字面上看没规则学习,对于一个不标记的案例,不用考虑它的特征值就会见拿它们预测也极其普遍的接近
  • 单规则算法(1R或者OneR)在ZeroR的根基及补偿加一个平整。像K近邻一样虽然简单,但是往往表现的可比你预期的亲善。
  • 瑜:可以生成一个单一的、易于理解的、人类可读之经验法则(大拇指法则);表现往往特别之好;可以看成再复杂算法的一个规格;
  • 短:只以了一个十足的特色;可能会见超负荷简短
  • R代码:
    下R包RWeka中OneR()函数来实现1R算法
      m <- OneR(class ~ predictors,data = mydata)
    #class:是mydata数据框中需要预测的那一列;predictors:为一个公式,用来指定mydata数据框中之所以来开展前瞻的特征;data:为含有一个class和predictors所求的多少的数据框;该函数返回一个1R型对象,该目标会用于预测
      p <- predict(m,test)
    #m:由函数OneR()训练之一个型;test:一个带有测试数据的数据框,该数据框和用来创造分类器的训练多少颇具相同的性状;该函数返回一个富含预测的色的向量

library(RWeka)
library(gmodels)

set.seed(12345) #set random seed in order to repeat the result
iris_rand <- iris[order(runif(150)),]
train <- iris_rand[1:105,]
test <- iris_rand[106:150,-5]
test.label <- iris_rand[106:150,5]

m <- OneR(Species ~ .,data=train)
pred <- predict(m,test)
CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)

查看转的条条框框,按照Petal的宽,分成三类,正确分类了105独里面的101个
统计 21
对于测试数据的杂矩阵如下
统计 22
看得出只以了一个平整为能够,也得了天经地义的效果