注意:因为es不允许root用户启动,所以需要新建新的用户来启动es

1.环境需求

新建普通用户es,单独为普通用户配置java11环境(es7需要java11 支持),然后在~/.bash_profile文件中配置好java环境变量:

export JAVA_HOME=~/software/jdk-11.0.3(java11所在地址 ~表示用户默认目录)
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

注意:配置好之后别忘记source ~/.bash_profile使环境变量生效。

查看java版本

java -version

每当启动es时,找不到java黄精,或java环境不对,都可以使用“source ~/.bashrc”启动一次,因为有时候有些系统启动是不默认运行bash_profile,当然在bashrc文件下添加环境变量也是一样。

2.配置elasticsearch.yml文件

进入elasticsearch/config文件夹下

#允许任意IP访问

network.host:0.0.0.0

#开放的端口

http.port: 9200

设置节点是否为master节点(true or false)

node.master: true

设置节点存储数据(true or false)

node.data: true

#集群间通信端口(可以修改)

transport.tcp.port: 9300

#添加跨域

http.cors.enabled: true
http.cors.allow-origin: "*"

#集群名称

cluster.name: es

#节点名称(集群内部节点名称不能相同)

node.name: master

#集群所有节点配置(你主机的ip地址,以及集群中es主机的ip地址,9300为es集群之间默认通信端口,要与设置的集群通信端口一致)如果只有一台设置只设置自己主机的就可以

discovery.seed_hosts: ["xx.xx.xx.xx:9300", "10.1.8.194:9300"]

集群内部master节点配置

cluster.initial_master_nodes: ["xx.xx.xx.xx:9300","xx.xx.xx.xx:9300"]

解释:设置两个节点为master节点如果一个节点挂了,另一个节点可以补上

#解决java.lang.UnsupportedOprationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled

因为Centos不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

3.系统配置问题(存在以下错误是在配置)

问题一:

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

解决切换到root用户

vim /etc/security/limits.conf

添加或修改如下内容

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

问题二

max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

解决:切换到root用户,进入limits.d目录下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf

修改如下内容:

* soft nproc 1024

#修改为

* soft nproc 2048

问题三

max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

解决:切换到root用户修改配置sysctl.conf

vi /etc/sysctl.conf

添加下面配置:

vm.max_map_count=262144

并执行命令:

sysctl -p

4. 防火墙

关闭防火墙

service iptables stop

或者将9200端口开启(这个没试)

我们在前面讲了线性回归模型,它可以对数据进行预测、拟合。假设有一个二元分类的问题,最终的结果有两类(0,1),此时我们如果使用线性回归模型,那么他的输出结果可能远大于1,或者小于0。这时候我们就需要一个算法使结果的输出一直处于(0,1)之间,这就是我们接下来要讲的逻辑回归算法。它在原有的线性回归算法外面,加上了一个sigmoid函数,使之输出一直处于0,1之间。

Sigmoid函数的公式为:

其中z为我们前面所说的线性函数:

这样最终的预测值就会处于0,1之间,我们将大于0.5的分类为1,小于0.5的分类为0。至于说为什么外面加上sigmiod函数预测值就处于0,1之间,大家可以考虑z,当z特别大时sigmiod函数就会接近1,z非常小时,sigmiod就会非常接近0。下面是sigmiod函数的图像,大家可以自己感受下

损失函数

我们在之前将线性回归的时候讲解了损失函数,但现在我们逻辑回归函数的损失函数与线性回归的损失函数是不同的,线性回归之中用到的损失函数为:

至于说为什么使用这个函数作为逻辑损失函数?大家可以考虑下:

当y=1时,损失函数

如果想损失函数L尽可能小,那么预测值就要尽可能大,因为sigmiod函数取值[0,1],因此预测值会无限接近1。

当y=0时,损失函数

如果想损失函数L尽可能小,那么预测值就要尽可能小,因为sigmiod函数取值[0,1],因此预测值会无限接近0。

参考:吴恩达深度学习视频

下面我们来介绍几种评估模型的几种方法。假设我们目前只有一个数据集D={(x1,y1),( x2,y2),...,( xm,ym)}既要训练,又要测试,该如何去做?

评估方法

1.留出法
将数据集D拆分成为两个互斥的集合,一个作为训练集S,另一个作为测试集D。

需要注意的是训练集与测试集的划分数据尽量保持一致性,可以选择分层抽样的方式,根据比例采样。

另外需要注意的是采用按比例分割仍有多种划分方式,单次使用留出法的得到的评估结果往往不够稳定,因此一般采用若干次随机划分、重复实验的方式取平均值后作为留出法的评估结果。

2.交叉验证法

“交叉验证法”先将数据集D划分成k个大小相似的互斥子集。每个子集 Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次选中k-1个子集作为训练集,剩下的那个子集作为测试集,从而可进行k次训练和测试,最终返回的结果是这k次测试结果的均值。

3.自助法

在留出法与交叉验证法中,由于一部分样本用于测试,因此会造成训练集样本数目过少的情况。在这里我们采用自助法(bootstrapping)作为解决方法。在给定的数据集D中,我们对它进行采样产生数据集 D:每次随机从D中挑选一个样本,将拷贝入 D中,然后重复m次,这样D中会有一部分样本在D 中多次出现,但仍有一部分样本没有在D中出现过。我们将D作为训练集,将没有出现过的样本作为测试集。

4.调参

大多数算法都有些参数需要设定,参数配置不同,学得模型的性能的性能往往有显著的差别。因此在模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的“调参”。

性能度量

下面说一些性能度量常见的符号。

精确率
P=

召回率
Re=

准确率
ACC=

误分配率
1-ACC

ROC曲线全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。它的横轴为“假正例率”(FPR),纵轴为“真正例率”(TPR),两者分别定义为:

tpr=

FPR=

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。

AUC值越大的分类器,正确率越高。

一、误差

统计学习的目的是是学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。当我们已经通过训练数据得到模型之后,我们可以用一组新的数据(测试数据)来看看模型效果如何。

20180816113210

我们计算出每个点与模型的距离,然后取平均,计算出平均误差。

201808161135

我们在训练数据集上得到的误差一般称作“训练误差”(training error),在新的样本上的误差成为“泛化误差”(generalization error)。我们都希望得到一个好的模型可以在新的样本之中得到一个较好的结果,使泛化误差变得更小。

二、过拟合

我们看下面的一张图

20181021060725

图中的第一张表是欠拟合的(高偏差),也就是说它没有很好的模拟出训练集的函数,最后一张表是过拟合的(高方差),因为它过度的拟合了训练集,无法更好的对新的数据进行预测。那么在遇到过拟合的问题时,我们该如何去做呢,一般有两种方式:

1.丢弃一些不能帮助我们正确预测的特征。可以手工标注,或者说使用一些模型来帮忙比如说PCA。

2.正则化。

三、正则化

我们可以看下面的一个公式

QQ20181021061943

我们发现正是由于高次项导致了过拟合问题,如果我们将这些高次项系数接近0,就可以很好的拟合,正则化就是在一定程度上减小这些参数的值。

为了减小这些参数的值,我们需要修改代价函数如下图所示:

081951193621142

我们在代价函数后面给加上θ3、θ4加上了一些惩罚项。因为,如果你在原有代价函数的基础上加上 1000 乘以 θ3 这一项 ,那么这个新的代价函数将变得很大,所以,当我们最小化这个新的代价函数时, 我们将使 θ的值接近于 0,同样 θ4 的值也接近于 0,就像我们忽略了这两个值一样。

如果我们不知道那些特征该惩罚那要怎么办呢?我们可以对所有的特征进行惩罚。因此最后的公式变为:QQ20181021143939

这就是正则化了。

参考:吴恩达机器学习视频

很久之前参加了个比赛,实现了一个提取论坛内容的算法。

一、挖掘目标

将论坛之中的内容按以下方式存储:

二、总体流程

总体流程图

三、主要贡献

本文做的主要贡献是实现了根据楼层相似结构地位并分割楼层。

我们查看BBS论坛页面的网页结构发现以下特征:

1.在同一个web页面中,每个楼层所在的DOM结构的节点的子树都很相似。

2.不同楼层都位于同一个父节点下面。

3.不同楼层之间为兄弟节点。

如下图所示:

楼层分割算法具体步骤:

1.筛选标签

首先将web页面转化为DOM结构,找出不可能成为节点的标签并剔除例如:

<link><head><p>......

对于一个帖子而言,有这么几方面重要的内容:作者、时间、正文内容,这三个方面之中,作者、正文内容结构是难以预测的,但是时间我们可以通过使用正则表达式进行匹配。因此,我们遍历出所有节点,将节点中不含有时间的节点剔除。

另外我们发现,一个楼层块中必定有很多的标签块,如作者、时间、内容等等,我们对每个楼层下的节点进行递归循环,发现楼层下的标签数量比较多,因此我们设置一个阈值进行过滤。将的标签数目少的节点过滤。

2.定位楼层

经过以上几个步骤之后,我们将每一块与他的所有兄弟节点进行比较,找到相同的块,并作为一个列表存储。如下图:

将2、3与4进行比较,8、9、10进行比较,最终我们会得到几个列表:

[2] [3] [4] [5,6] ...[8,9,10]...

列表内节点个数最多的为楼层序列。