状态为 D (Uninterruptible sleep) ,以及状态为 Z (Zombie)这些垃圾进程要么是求而不得,像怨妇一般等待资源(D),要么是僵而不死,像冤魂一样等待超度(Z),它们在 CPU run_queue 里滞留不去,把 Load Average 弄的老高老高,没看过我前一篇blog的国际友人还以为这儿民怨沸腾又出了什么大事呢。怎么办?开枪!kill -9!看你们走是不走。但这两种垃圾进程偏偏是刀枪不入的,不管换哪种枪法都杀不掉它们。无奈,只好reboot,像剿灭禽流感那样不分青红皂白地一律扑杀!
基本想法就是修改内核,遍历进程列表,找到处于D状态的进程,将其状态转换为别的状态就可以kill掉了。
这是一种比较粗鲁的方法,可能会引起一些不良后果,暂时没有考虑。对于确切知道已经没有什么用处,不用做清理工作的,处于D状态怎么也杀不死的进程来说,确是很有效。
内核模块代码:
—————-killd.c—————-
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h> //for_each_process
MODULE_LICENSE("BSD");
static int pid = -1;
module_param(pid, int, S_IRUGO);
static int killd_init(void)
{
struct task_struct * p;
printk(KERN_ALERT "killd: force D status process to death/n");
printk(KERN_ALERT "killd: pid=%d/n", pid);
//read_lock(&tasklist_lock);
for_each_process(p){
if(p->pid == pid){
printk("killd: found/n");
set_task_state(p, TASK_STOPPED);
printk(KERN_ALERT "killd: aha, dead already/n");
return 0;
}
}
printk("not found");
//read_unlock(&tasklist_lock);
return 0;
}
static void killd_exit(void)
{
printk(KERN_ALERT "killd: bye/n");
}
module_init(killd_init);
module_exit(killd_exit);
—–Makefile————
obj-m := killd.o
编译模块
make -C yourkerneltree M=`pwd` modules
插入模块的时候提供D状态的进程号,就可以将其转换为stopped状态,使用普通kill就可以杀死。
./insmod ./killd.ko pid=1234
【zt】LogisticRegression 调参 & GridSearchCV
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【zt】LogisticRegression 调参 & GridSearchCV相关的知识,希望对你有一定的参考价值。
参考技术A 资料目录:1. LogisticRegression()参数解析
2. sklearn-GridSearchCV,CV调节超参使用方法
=====================================================================
C : float, optional (default=1.0)
Inverse of regularization strength; must be a positive float. Like in support vector machines, smaller values specify stronger regularization.
C为正则化系数λ的倒数,必须为正数,默认为1。和SVM中的C一样,值越小,代表正则化越强。
class_weight : dict, ‘auto’, optional 考虑类不平衡,类似于代价敏感
Over-/undersamples the samples of each class according to the given weights. If not given, all classes are supposed to have weight one. The ‘auto’ mode selects weights inversely proportional to class frequencies in the training set.
penalty : 正则化参数:’l1’,’l2’.默认是’l2’。
在调参时如果我们主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。 另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择。
solver: 逻辑回归损失函数的优化方法,有四种算法供选择
‘newton-cg’:坐标轴下降法来迭代优化损失函数
‘lbfgs’:, ‘liblinear’:牛顿法变种
‘sag’:随机梯度下降
其中‘newton-cg’, ‘lbfgs’, ‘sag’只适用于L2惩罚项的优化,liblinear两种都适用。因为L1正则化的损失函数不是连续可导的,而‘newton-cg’, ‘lbfgs’,‘sag’这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。
当样本数目比较大时,使用sag效果较好,因为它只使用一部分样本进行训练。
a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
小结:
multi_class
‘ovr’, ‘multinomial’, default: ‘ovr’
OvR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。multinomial相对复杂。
官网有个对比两种分类方式的例子: 链接地址 。
class_weight :类型权重参数。
用于标示分类模型中各种类型的权重。默认不输入,即所有的分类的权重一样。选择‘balanced’自动根据y值计算类型权重。自己设置权重,格式:class_label: weight。例如0,1分类的er'yuan二元模型,设置class_weight=0:0.9, 1:0.1,这样类型0的权重为90%,而类型1的权重为10%。
n_jobs=1 : 并行数
int:个数;-1:跟CPU核数一致;1:默认值。
其他参数:
dual=False: 对偶或者原始方法。Dual只适用于正则化相为l2的‘liblinear’的情况,通常样本数大于特征数的情况下,默认为False。
fit_intercept=True: 是否存在截距,默认存在。
intercept_scaling=1: 仅在正则化项为‘liblinear’,且fit_intercept设置为True时有用。
max_iter=100: 算法收敛的最大迭代次数。
tol=0.0001: 迭代终止判据的误差范围。
verbose=0: 日志冗长度int:冗长度;0:不输出训练过程;1:偶尔输出; >1:对每个子模型都输出
warm_start=False: 是否热启动,如果是,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。布尔型,默认False。
LogisticRegression类的常用方法
fit(X, y, sample_weight=None)
拟合模型,用来训练LR分类器,其中X是训练样本,y是对应的标记向量
返回对象,self。
fit_transform(X, y=None, **fit_params)
fit与transform的结合,先fit后transform。返回X_new:numpy矩阵。
predict(X)
用来预测样本,也就是分类,X是测试集。返回array。
predict_proba(X)
输出分类概率。返回每种类别的概率,按照分类类别顺序给出。如果是多分类问题,multi_class="multinomial",则会给出样本对于每种类别的概率。
返回array-like。
score(X, y, sample_weight=None)
返回给定测试集合的平均准确率(mean accuracy),浮点型数值。
对于多个分类返回,则返回每个类别的准确率组成的哈希矩阵。
上述内容汇总自不同网站,但多数内容来自于这个链接:https://www.jianshu.com/p/e51e92a01a9c
-----------------------------------------------------------------------------------------------
【其他】
sklearn-GridSearchCV,CV调节超参使用方法:https://blog.csdn.net/u012969412/article/details/72973055
GridSearchCV 简介:
GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化。回到sklearn里面的GridSearchCV,GridSearchCV用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。
GridSearchCV官方网址: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
常用参数解读:
estimator :所使用的分类器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法。
param_grid :值为字典或者列表,即需要最优化的参数的取值,param_grid =param_test1,param_test1 = 'n_estimators':range(10,71,10)。
scoring : 准确度评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。scoring参数选择如下:
参考地址: http://scikit-learn.org/stable/modules/model_evaluation.html
cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
refit :默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
iid :默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
verbose :日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。
n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。
pre_dispatch :指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次
常用方法:
grid.fit():运行网格搜索
grid_scores_:给出不同参数情况下的评价结果
best_params_:描述了已取得最佳结果的参数的组合
best_score_:成员提供优化过程期间观察到的最好的评分
如何杀掉D状态的进程?[zt]
原贴:http://www.xclinux.cn/?p=752
如何杀掉D状态的进程?[zt]
以上是关于【zt】LogisticRegression 调参 & GridSearchCV的主要内容,如果未能解决你的问题,请参考以下文章