Jiahong的个人博客

凡事预则立不预则废


  • Home

  • Tags

  • Archives

  • Search

ML——LdaModel在gensim的使用

Posted on 2018-09-25

LDA在Python库gensim中的模型和参数介绍


API

1
2
3
4
5
6
7
class LdaModel(interfaces.TransformationABC, basemodel.BaseTopicModel):
def __init__(self, corpus=None, num_topics=100, id2word=None,
distributed=False, chunksize=2000, passes=1, update_every=1,
alpha='symmetric', eta=None, decay=0.5, offset=1.0, eval_every=10,
iterations=50, gamma_threshold=0.001, minimum_probability=0.01,
random_state=None, ns_conf=None, minimum_phi_value=0.01,
per_word_topics=False, callbacks=None, dtype=np.float32)
1
2
3
# a simple example
import gensim
gensim.models.ldamodel.LdaModel(corpus, num_topics=2, id2word=dictionary, passes=20)

Parameters

  • 主要参数:

    • corpus: 语料库,类似于

      [ [(1, 1),(4, 1)], [(2, 1),(3, 2)] ]

      • gensim库中一般默认corpus参数是经过字典编码统计的,类似于上面的形式,而texts是文本的列表的形式
    • num_topics: 主题数量,超参数

    • id2word: dict of (int, str), :class:gensim.corpora.dictionary.Dictionary

      • 用于将corpus中的数字与词进行对应,这里应该为把texts转成corpus的那个字典
    • passes: 训练时的迭代次数

    • iterations: 推断时的迭代次数

    • alpha: 主题的先验概率

      • 一个num_topics大小的数组表明每个主题的概率
      • 也可以是str类型的值
        • “asymmetric”: 固定初始化为1.0/num_topics
    • decay: (0.5, 1]之间的浮点数,前一个lambda值被遗忘的百分比?【待确认参数】

  • 其他参数:

    • distributed: 是否使用分布式计算

相关类介绍

  • gensim.corpora.dictionary.Dictionary
    1
    2
    class Dictionary(utils.SaveLoad, Mapping):
    def__init__(self, documents=None, prune_at=2000000)
1
2
3
4
5
6
7
# a simple example
from gensim.corpora import Dictionary
texts = [['human', 'interface', 'computer']]
dct = Dictionary(texts) # initialize a Dictionary
dct.add_documents([["cat", "say", "meow"], ["dog"]]) # add more document (extend the vocabulary)
dct.doc2bow(["dog", "computer", "non_existent_word"])
# output: [(0, 1), (6, 1)]

完整代码示例

Linux——在root用户下也无法删除文件

Posted on 2018-09-24

本文介绍Linux中即使是root用户,某些特殊文件也无法删除的问题

  • 相关指令:
    • chattr
    • lsattr

问题来源

  • chattr命令给予用户权限去修改文件属性已提高系统的安全性
    • 注意chattr命令不能保护/, /dev, tmp, var目录(本身)
  • 其中一个属性i可以使得文件无法被删除,重命名,设置链接,同时不能修改内容等
    • 添加i属性指令: chattr +i [filename]
    • 移除i属性指令: chattr -i [filename]
  • 问题特征表现为,在root用户权限下,某些文件无法删除,报错为:

    rm: cannot remove ‘[filename]’: Operation not permitted


解决方案

  • 查看文件属性

    1
    lsattr [filename]
    • 此时文件属性中会多一个i属性
  • 删除文件i属性

    1
    chattr -i [filename]
    • 文件i属性删除后可以正常修改或者删除文件了

相关说明

  • 参考博客链接为: http://www.ha97.com/5172.html

    + :在原有参数设定基础上,追加参数。
    - :在原有参数设定基础上,移除参数。
    = :更新为指定参数设定。
    A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
    S:硬盘I/O同步选项,功能类似sync。
    a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
    c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
    d:即no dump,设定文件不能成为dump程序的备份目标。
    i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
    j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
    s:保密性地删除文件或目录,即硬盘空间被全部收回。
    u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。
    各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。


评论补充说明

  • 参考地址: http://www.ha97.com/5172.html 的评论部分

    i: 将无法对文件进行修改,若对目录设置后则仅能修改子文件而不能新建或删除。
    a: 仅允许补充(追加)内容.无法覆盖/删除(Append Only)。
    S: 文件内容变更后立即同步到硬盘(sync)。
    s: 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)。
    A: 不再修改这个文件的最后访问时间(atime)。
    b: 不再修改文件或目录的存取时间。
    D: 检查压缩文件中的错误。
    d: 当使用dump命令备份时忽略本文件/目录。
    c: 默认将文件或目录进行压缩。
    u: 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复。
    t: 让文件系统支持尾部合并(tail-merging)。
    X: 可以直接访问压缩文件的内容。

ML——各种数据分析图介绍.md

Posted on 2018-09-24

[日常编辑]
Python数据分析时可能用到各种各样的图,本文将简单介绍数据分析中常用的几种基本图


直方图(Hist-plot)


柱形图(Dist-plot)

seaborn.distplot

  • 集合了matplotlib的hist()与核函数估计kdeplot的功能

核密度估计图(KDE-plot)

seaborn.kdeplot


箱式图(Box-plot)


小提琴图(Violin-plot)

  • 用于显示数据分布及其概率密度
  • 竖向显示类似于箱式图,横向表征密度分布,越宽的地方密度分布越高

ML——机器学习中的编码方式

Posted on 2018-09-24

One-hot encoding与Dummy-encoding易混淆点区分
Label Encoding标签编码


独热码(One-Hot code)

  • 又称独热编码、一位有效编码,直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。
  • 其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

 哑变量编码(Dummy encoding)

  • 哑变量编码直观的解释就是在One-Hot编码的基础上任意的将一个状态位去除
    • 比热独码少一维即可编码
  • 可以理解为多个状态位之间是相关的,已知n-1个那么可以推出剩下的那个
    • 比如已知前n-1个状态位为0,那么最后一位一定为1
    • 一种做法是: 全0算是一维(理解: 由于全0可以默认最后一位为1, 其他非全0的可以默认最后一维为0,所以能够区分不同样本)

哑变量(Dummy variable)

亦称指示变量(Indicator variable)

  • 以上两种编码得到的变量都称为指示变量或者哑变量

为什么需要One-Hot编码?

  • 大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的, 使用one-hot编码, 将离散特征的取值扩展到了欧式空间, 离散特征的某个取值就对应欧式空间的某个点, 将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理
  • 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间

独热编码优缺点

优点

  • 独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用
  • 它的值只有0和1,不同的类型存储在垂直的空间
  • 数据天然归一化了, 非常优秀

缺点

  • 当类别的数量很多时,特征空间会变得非常大
    • 一般可以用PCA来减少维度
    • One-Hot encoding + PCA 这种组合在实际中也非常有用

什么时候不用独热编码

  • 有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码, 典型的代表如XGBoost, LightGBM等
  • 存在偏序关系的特征,不能用独热编码, 独热编码会使得特征失去原来的偏序关系

标签编码

Label Encoding

  • 将类别编码为连续的数值类型(0,1,2,3…)
  • 举例
    1
    2
    3
    4
    5
    6
    7
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    le.fit([1,8,9,67,5,8,6])
    print(le.transform([1,1,8,9,67,5,5]))

    # Output:
    [0 0 3 4 5 1 1]

附录: 机器学习过程

ML——箱式图基本概念介绍

Posted on 2018-09-24

箱式图,是指—种描述数据分布的统计图

  • 是表述最小值、第一四分位数、中位数、第三四分位数与最大值的一种图形方法。
  • 可以粗略地看出数据是否具有对称性,分布的分散程度等信息

异常值

又称离群值(Outlier), 指不在区间[Q1-1.5IQR, Q3+1.5IQR]中的值

  • Q1为25%中位数,也称为下四分位数
  • Q3为75%中位数,也称为上四分位数
  • IQR为Q3-Q1,四分数间距

绘图方法

去除离群值之后的部分计入图中,分别标记五个特征值

  • 特征值 最小值,Q1,中位数,Q3,最大值
  • 将五个数值描绘在一个图上,五个特征值在一个直线上
  • 最小值和Q1连接起来,Q1、中位数、Q3分别作平行等长线段
  • 连接两个四分位数构成箱子
  • 连接两个极值点与箱子,形成箱式图
  • 最后点上离群值

实例

ML——误差棒简单介绍

Posted on 2018-09-24

Reference[1]: 维基百科
Reference[2]: How to Calculate Error Bars?


误差棒

(Error bar, 也称为误差线)

显示潜在的误差或相对于系列中每个数据标志的不确定程度

  • 误差线可以用标准差(standard deviation)或者标准误差(standard error),一般用标准差

标准差与标准误差

  • 标准差是离均差平方和平均后的方根
  • 标准误是标准误差,定义为各测量值误差的平方和的平均值的平方根
  • 标准差与均数结合估计参考值范围,计算变异系数,计算标准误等。标准误用于估计参数的可信区间,进行假设检验等
  • 当样本含量 n 足够大时,标准差趋向稳定;而标准误随n的增大而减小,甚至趋于0

计算误差棒

  • Step1: 计算均值 E
  • Step2: 计算标准差 D
  • Step3: 计算误差棒的两端值
    • barBegin = E-D
    • barEnd = E+D

Git——子目录中有Git项目时如何管理

Posted on 2018-09-22

Git——submodule

如果Git项目下面有个子项目也是Git下来(往往是git clone命令下载的)的,我们往往不能正常的提交和管理项目,本文给出了一些解决方案
如果子项目是git clone别人的项目,我们选择将子项目提交到整个大项目中
如果直接添加项目到Git往往提示:modified:xxx(modified content, untracked content)
此时如果直接提交,那么远程仓库里面子项目将是空的


融合子项目

删除.git/文件夹

  • 删除子项目下的.git/文件夹
    1
    rm -rf xxx/.git/

删除缓存

  • 删除之前提交过的子项目cache
    1
    2
    3
    4
    5
    # 删除子项目缓存 
    git rm -r --cached xxx/
    # 如果提示error: the following file has staged content different from both the file and the HEAD: xxx
    # 那么按照提示-f参数即可
    git rm -rf --cached xxx/

Note: 没有第二步的话直接进行第三步将和之前一样,子目录还是空的

重新添加

  • 重新添加子项目文件夹
    git add xxx

保持子项目为一个独立的项目

创建子项目

  • 像正常创建项目一样在Github上创建项目

  • 添加一个项目为子项目

    1
    git submodule add git@github.com:JoeZJH/Submodule.git submodule_name
    • 这个操作将会带来三方面的效果

      • 在当前文件夹和.git/modules/文件夹下以submodule_name为文件夹名创建新的文件夹
      • 将git@github.com:JoeZJH/Submodule.git链接和文件夹名submodule_name添加到当前文件夹的.gitmodules文件(若没有该文件则会自动新建该文件)和.git/config文件夹中
      • 将git@github.com:JoeZJH/Submodule.git项目中的文件下载到submodule_name中,并在submodule_name文件夹下生成.git文件夹
    • 需要注意的是:

      • 这里项目里面应该有内容(项目内容不能为空,否则添加会失败)
      • 理解:项目为空时被添加为子项目会在本地和.git/modules/中生成文件夹,但是不会执行后面的步骤
  • 查看添加项目结果

    1
    git status
    • 这里可以看到至少
      • .gitmodules被修改
      • submodule_name被添加
  • 提交子项目添加结果

    1
    2
    git add .
    git commit -m "comments"

修改子项目

  • 直接切换到子项目目录下
  • 然后按照正常Git项目操作,提交

在外层项目上提交子项目修改

  • 提交子项目修改直接把子项目的文件夹当成一个整体的文件
  • 子项目必须在全部修改内容被commit后才能被外层项目提交修改,否则在外层项目中执行git add .操作将无发添加子项目修改内容

移除子项目

  • 递归删除./和.git/modules/下的子项目(模块)目录
  • 删除.gitmodules,.git/config中相关的模块条目

初始化带有子项目的项目

  • 正常拉取外层项目

    1
    git pull origin master:master
    • 此时关于子模块的信息除了./.gitmodules文件包含外,其他的文件都不包含,包括./.git中
  • 初始化子模块

    1
    git submodule init
    • 将.gitmodules中的所有子模块注册到外层项目中
    • 注册方式: 添加子模块信息(文件夹路径和子模块项目地址)到.git/config文件中并指明子模块对应的active = true
  • 更新子模块(如果子模块之前存在于.git/config中,且active = false,这个初始化操作会修改为active = true)

    1
    git submodule update
    • 将.git/config和.gitmodules中的所有子模块的链接地址项目下载到.git/modules/中,并自动同步(自动checkout操作)到子项目文件夹中
    • 注意git submodule init后,.git/config和.gitmodules应该是一致的
    • .git/config和.gitmodules中都有,且在.git/config中active = true的子项目才能被update操作下载

理解

  • 子项目自己知道自己被当做子项目
    • 一个项目被作为子项目后,他的./submodule_name/.git将不再是一个文件夹,而是一个指明.git/文件夹路径的配置文件
      1
      cat ./submodule_name/.git

gitdir: ../.git/modules/submodule_name

* `.git/`文件夹可以在`./.git/modules/submodule_name/.git/`中找到
  • 子项目相关信息都在外层项目中显示出来

  • 在子项目文件夹./submodule_name/下,子项目的更新,提交等操作正常按照一般项目进行即可

    • 这里操作时虽然仓库在外层项目的./.git/modules/submodule_name/.git/中,但是在子项目的目录下我们可以正常访问子项目的仓库
    • 也就是说在子项目文件夹下的git操作(add, commit)实际上不修改当前文件夹下的任何文件,修改都在外层项目的./.git/modules/submodule_name/.git/仓库中
  • 外层项目只存储

    • 子项目文件夹
    • 在./.gitmodules中存储子项目相关信息(文件夹路径与子项目远程地址)
    • 在GitHub中,直接用网页打开项目可以看到子项目会被自动解析远程地址和最近提交的ID信息,点击子项目对应的文件夹链接即可跳转到子项目远程仓库地址中

递归子项目

  • 递归时记住项目的库都在副项目的库中即可
    • 这句话等价于所有项目的库都在根项目的.git/中

Ubuntu——安装Ubuntu后要首先要做的事情

Posted on 2018-09-22

原生的Ubuntu有许多没用的软件和包,也有很多我们需要但是没装的软件和包,本文将介绍安装Ubuntu后一般来说需要对系统做哪些自定义的修改,可按照需要选择适合的软件


删除几乎不用的软件

sudo apt-get remove libreoffice-common

sudo apt-get remove unity-webapps-common

sudo apt-get remove thunderbird totem rhythmbox empathy brasero simple-scan gnome-mahjongg aisleriot gnome-mines cheese transmission-common gnome-orca webbrowser-app gnome-sudoku  landscape-client-ui-install

sudo apt-get remove onboard deja-dup

删除的软件参考自其他博客
reference: https://blog.csdn.net/skykingf/article/details/45267517


安装Vim

sudo apt-get install vim

安装Google Chrome

cd ~/Downloads
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt-get install libappindicator1 libindicator7
sudo dpkg -i google-chrome-stable_current_amd64.deb 
sudo apt-get -f install

# 运行chrome
google-chrome

安装Oracle Java

sudo add-apt-repository ppa:webupd8team/java  
sudo apt-get update  
sudo apt-get install oracle-java8-installer 

# 删除残留
sudo rm /usr/share/upstart/sessions/jayatana.conf

# 测试安装成果
java -version
# 如果第一行是版本号则成功

安装经典菜单指示器

  • ClassicMenu Indicator, 用于代替Ubuntu自带的应用检索器
    sudo add-apt-repository ppa:diesch/testing
    sudo apt-get update
    sudo apt-get install classicmenu-indicator

安装系统指示器SysPeek

  • 查看系统管理,包括内存和CPU消耗等
    sudo add-apt-repository ppa:nilarimogard/webupd8
    sudo apt-get update
    sudo apt-get install syspeek

安装Git

sudo apt-get install git

安装unrar

sudo apt-get install unrar

# 使用命令
unrar x test.rar

安装flux的gui版本fluxgui

sudo add-apt-repository ppa:nathan-renniewaldock/flux
sudo apt-get update
sudo apt-get install fluxgui

安装网易云音乐

Note: 新版本1.1.0有问题,所以选择1.0.0版本
网易云1.0.0版本下载地址


安装Remmina

  • 一款开源的优雅的远程桌面GUI客户端

    sudo apt-add-repository ppa:remmina-ppa-team/remmina-next
    sudo apt-get update
    sudo apt-get install remmina remmina-plugin-rdp libfreerdp-plugins-standard

  • 如有问题参考Remmina安装链接*


安装词典GoldenDict

  • 一款崇尚自定义的词典

安装

1
2
3
4
# 安装词典
sudo apt-get install goldendict
# 安装En-En在线词库【可选】
sudo apt-get install goldendict-wordnet

配置

  • 配置在线有道词典
    • Edit->Dictionaries->Websites->Add
    • Name: Youdao
    • Address: http://dict.youdao.com/search?q=%GDWORD%&ue=utf8
    • Enabled: Checked
    • ->Apply->OK
  • 配置Bing在线词典
    • 参考在线有道词典的配置
    • Name: Bing
    • Address: https://cn.bing.com/dict/search?q=%GDWORD%
  • 配置离线词典
    • 下载需要的词典: http://download.huzheng.org/zh_CN/
    • 解压
    • 将解压后的文件目录添加到字典中:
      • Edit->Dictionaries->Files->Add
      • 选中刚才的文件目录
      • ->Apply->OK
  • 开启划词翻译
    • 在GoldenDict主页点击小笔即可

安装Shadowsocks

安装Shadowsocksy有两种方式,分别为命令行和Gui版本, 两种方式安装后都需要设置浏览器才能使用VPN

命令行版本安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 安装
sudo apt-get update
sudo apt-get install python-pip
# 下面这行有时候可选
sudo apt-get install python-setuptools m2crypto
pip install shadowsocks
sudo gedit /etc/shadowsocks.json

# 配置文件
{
"server":"xx.xx.xx.xx",
"server_port":xxxx,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"xxxxxxxx",
"timeout":600,
"method":"xxx",
"fast_open": true,
"workers": 1
}

# 运行
sslocal -c /etc/shadowsocks.json

Shadowsocks Gui版本安装

  • 从网站下载release版本: shadowsocks-qt5 GitHub

  • 添加运行权限:

    1
    chmod +x xxx
  • 现在双击即可运行

  • 在打开的Gui中导入json即可

  • 如果想把Shadowsocks添加到启动器,参考Utuntu——添加自定义的软件到启动器

浏览器配置

  • 以上两种版本安装配置后,想要用浏览器科学上网还需要配置浏览器
Firefox
>Menu
-> Preferences
-> Network Proxy Setting
-> Manual proxy configuration
-> Socks Host: 127.0.0.1:1080
-> SOCKS v5
Chrome
  • 分两种方式,一种是不用安装任何插件,在命令行启动时制定代理即可,一种需要安装SwitchyOmega插件
  • 直接使用命令行
    # 不用安装任何代理
    google-chrome --proxy-server=socks5://127.0.0.1:1080
  • 安装代理: Switchy Omega
  • 安装SwitchyOmega插件时需要科学上网,所以可以先用上面的命令行启动,然后使用Chrome安装SwitchyOmega插件*
  • 配置方面参考SwitchyOmega官网(自动切换模式配置方便): SwitchyOmega官网/Settings*

安装wps和字体

  • 安装libpng
    • 网站里面有多个源,可随意选一个下载
    • 也可使用命令直接下载
1
wget http://ftp.cn.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.49-1+deb7u2_amd64.deb
  • 安装wps-office
  • 安装字体wps-office-fonts_1.0_all.deb

为Ubuntu添加Windows的字体

这个字体可以保证终端等能使用中文,同时能保证wps能正常使用

  • 从Windows系统的 Windows/Fonts/ 拷贝所有文件,大小大概500M+
  • 在Ubuntu上新建文件夹,建议放到/usr/share/fonts/下面, 比如/usr/share/fonts/win-fonts/
  • 将字体文件拷贝到新建立的文件夹下面
  • 执行下面命令
1
2
3
4
cd /usr/share/fonts/
sudo mkfontdir
sudo mkfontscale
sudo fc-cache

设置截图快捷键

在Windows和Mac下使用QQ快捷键截图习惯了后,到了Ubuntu会不习惯, 因为Ubuntu默认截图是保存到Pictures文件夹的,不是粘贴板
这里给出一种利用Ubuntu自带的软件gnome-screenshot实现QQ快捷键相同功能的方法

  • 添加快捷键Ctrl+Alt+A绑定到命令gnome-screenshot -ac
  • gnome-screenshot -c是全屏截图,也可以设置成自己喜欢的快捷键
  • gnome-screenshot参数简介
    • -c, 保存到剪贴板
    • -w, 截取当前窗口
    • -a, 选择一个区域
    • 如果没有任何参数默认是将当前全屏截图,并保存到Pictures文件夹
    • 更多gnome-screenshot参数参考gnome-screenshot -h

安装sublime

  • 添加安装源

    1
    2
    3
    wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
    sudo apt-get install apt-transport-https
    echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list
  • 更新库

    1
    sudo apt-get update
  • 用apt-get命令安装sublime

    1
    sudo apt-get install sublime-text
  • Sublime中输入中文

  • 说明: 如果不执行这一步,Sublime在Ubuntu中是不能直接输入中文的*

    1
    2
    3
    4
    5
    git clone --depth=1 https://github.com/lyfeyaj/sublime-text-imfix.git
    cd sublime-text-imfix
    ./sublime-imfix
    cd ..
    rm -rf sublime-text-imfix
  • 添加一点说明

    • 如果上面的方法不能安装最新版或者安装失败,可以尝试自己下载软件发行版并自己添加sublime到启动器,添加自定义程序到启动器的方法可参考 Utuntu——添加自定义的软件到启动器

下面是一些没经过测试的,之后会测试验证

Ubuntu——远程登录Ubuntu后只有一个$符号

Posted on 2018-09-22

对新添加的用户,我们远程登录Ubuntu后有时候只有一个$符号


问题描述

  • 对新添加的用户,远程登录Ubuntu后有时候只有一个$符号

问题原因

  • Ubuntu为新用户默认启动的是sh而不是bash
  • sh的命令比较少,只有一些ls, pwd这样的命令

解决方案

不修改源文件

  • 每次登录时先使用bash命令运行bash程序
  • 之后的指令都会是bash解释执行
  • 在bash中使用sh可会退到sh命令行
  • 该方法的缺陷在于多次执行bash和sh后,会造成进程嵌套多次,这样exit指令退出时需要多次

修改源文件

  • 标记文件/etc/passwd
1
sudo vi /etc/passwd
  • 找到用户对应的启动命令并将sh(可能没有sh,直接是空白)修改为bash
    1
    2
    3
    4
    # 修改前
    jiahong:x:1001:1001::/home/jiahong:
    # 修改后
    jiahong:x:1001:1001::/home/jiahong:/bin/bash

ML——xgboost包使用笔记

Posted on 2018-09-20

xgboost包中包含了XGBoost分类器,回归器等, 本文详细介绍XGBClassifier类


安装和导入

  • 安装

    1
    pip install xgboost
  • 导入

    1
    import xgboost as xgb
  • 使用

    1
    clf = xgb.XGBClassifier()

模型参数

普通参数

以下参数按照我理解的重要性排序

  • booster:
    • ‘gbtree’: 使用树模型作为基分类器
    • ‘gbliner’: 使用线性模型作为基分类器
    • 默认使用模型树模型即可,因为使用线性分类器时XGBoost相当于退化成含有L1和L2正则化的逻辑回归(分类问题中)或者线性回归(回归问题中)
  • n_estimators: 基分类器数量
    • 每个分类器都需要一轮训练,基分类器越多,训练所需要的时间越多
    • 经测试发现,开始时越大越能提升模型性能,但是增加到一定程度后模型变化不大,甚至出现过拟合
  • max_depth[default=3]: 每棵树的最大深度
    • 树越深,越容易过拟合
  • objective[default="binary:logistic"]: 目标(损失函数)函数,训练的目标是最小化损失函数
    • ‘binary:logistic’: 二分类回归, XGBClassifier默认是这个,因为XGBClassifier是分类器
    • ‘reg:linear’: 线性回归, XGBRegressor默认使用这个
    • ‘multi:softmax’: 多分类中的softmax
    • ‘multi:softprob’: 与softmax相同,但是每个类别返回的是当前类别的概率值而不是普通的softmax值
  • n_jobs: 线程数量
    • 以前使用的是nthread, 现在已经不使用了,直接使用n_jobs即可
    • 经测试发现并不是越多越快, 猜测原因可能是因为各个线程之间交互需要代价
  • reg_alpha: L1正则化系数
  • reg_lambda: L2正则化系数
  • subsample: 样本的下采样率
  • colsample: 构建每棵树时的样本特征下采样率
  • scale_pos_weight: 用于平衡正负样本不均衡问题, 有助于样本不平衡时训练的收敛
    • 具体调参实验还需测试[待更新]
    • 这个值可以作为计算损失时正样本的权重
  • learning_rate: shrinkage参数
    • 更新叶子结点权重时,乘以该系数,避免步长过大,减小学习率,增加学习次数
    • 在公式中叫做eta, 也就是 \(\eta\)
  • min_child_weight[default=1]: [待更新]
  • max_leaf_nodes: 最大叶子结点数目
    • 也是用于控制过拟合, 和max_depth的作用差不多
  • importance_type: 指明特征重要性评估方式, 只有在booster为’gbtree’时有效
    • ‘gain’: [默认], is the average gain of splits which use the feature
    • ‘cover’: is the average coverage of splits which use the feature
    • ‘weight’: is the number of times a feature appears in a tree
    • ‘total_gain’: 整体增益
    • ‘total_cover’: 整体覆盖率

常用函数

  • feature_importances_:

    • 返回特征的重要性列表
    • 特征重要性可以由不同方式评估
    • 特征重要性评估指标(importance_type)在创建时指定, 使用plot_importance函数的话,可以在使用函数时指定
  • plot_importance: 按照递减顺序给出每个特征的重要性排序图

    • 使用方式

      1
      2
      3
      4
      from xgboost import plot_importance
      from matplotlib import pyplot
      plot_importance(model)
      pyplot.show()
    • 详细定义

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      def plot_importance(booster, ax=None, height=0.2,
      xlim=None, ylim=None, title='Feature importance',
      xlabel='F score', ylabel='Features',
      importance_type='weight', max_num_features=None,
      grid=True, show_values=True, **kwargs):
      """Plot importance based on fitted trees.
      Parameters
      ----------
      booster : Booster, XGBModel or dict
      Booster or XGBModel instance, or dict taken by Booster.get_fscore()
      ax : matplotlib Axes, default None
      Target axes instance. If None, new figure and axes will be created.
      grid : bool, Turn the axes grids on or off. Default is True (On).
      importance_type : str, default "weight"
      How the importance is calculated: either "weight", "gain", or "cover"
      * "weight" is the number of times a feature appears in a tree
      * "gain" is the average gain of splits which use the feature
      * "cover" is the average coverage of splits which use the feature
      where coverage is defined as the number of samples affected by the split
      max_num_features : int, default None
      Maximum number of top features displayed on plot. If None, all features will be displayed.
      height : float, default 0.2
      Bar height, passed to ax.barh()
      xlim : tuple, default None
      Tuple passed to axes.xlim()
      ylim : tuple, default None
      Tuple passed to axes.ylim()
      title : str, default "Feature importance"
      Axes title. To disable, pass None.
      xlabel : str, default "F score"
      X axis title label. To disable, pass None.
      ylabel : str, default "Features"
      Y axis title label. To disable, pass None.
      show_values : bool, default True
      Show values on plot. To disable, pass False.
      kwargs :
      Other keywords passed to ax.barh()
      Returns
      -------
      ax : matplotlib Axes
      """
1…8910…20
Joe Zhou

Joe Zhou

世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活。 ——罗曼·罗兰

195 posts
38 tags
GitHub E-Mail
© 2024 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4