您的位置:首页 > 其它

【机器学习】Sklearn 调试模型

2017-12-11 11:45 411 查看
1、过拟合

处理过拟合的方法有:

a>减少特征,降低模型的复杂度

b>减小调试参数

c>增加训练数据量

常用的调参方法就是通过在惩罚函数中新增一个正则化参数C来控制分类边界对样本的辨识度,如果是用权重的二次方,则是L2正则化,如果是|W|/C则是L1正则化。

L2损失函数:

X是训练集,W权重矩阵,b是偏置向量,y真实标签值
def loss_func(X,W,b,y):
s = score(X,W,b)
p = softmax(s)
return -np.mean(cross_entropy(y,p))+np.mean(np.dot(w.T,w)/c)


2、欠拟合

处理方式正好和过拟合相反:

a>增加特征,增加模型的复杂度

b>减大调试参数

3、交叉验证

在训练数据上训练好模型,在测试数据看训练的效果,将测试集成绩最好的参数组合作为模型的参数,这种方法就是交叉验证。

但是为了防止特定的数据造成的偶然性,这里通过取交叉验证结果的平均值作为模型的参数成绩,这就是k折交叉算法。

import sklearn
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score,KFold

data = datasets.load_iris()
X = data['data']
y = data['target']

clf = KNeighborsClassifier()

#直接算出每个交叉验证模型的得分,得到得分的数组,然后可以i取平均
scores = cross_val_score(clf, data.data, data.target, cv=5)
#print(scores.mean())

#查看KFold的执行算法过程
kf = KFold(n_splits = 5)
#print(kf)
#kf = KFold(len(y_train),n_folds =10)
for train, test in kf.split(X):
#获取训练和测试数据
#print("%s %s" % (train, test))
X_train,X_test = X[train],X[test]
y_train,y_test = y[train],y[test]
print(X_train,X_test)


4、Gridsearch暴力寻参

可以通过设置一个参数搜索空间,暴力搜索所有的参数组合,可以同时寻找多个最优参数。

寻找最有参数搜索范围只要要两步:第一定义搜索范围,第二在数据中尝试所有的参数组合。

紧接上例,寻找KNN模型的参数K(近邻数量)的最价值:

from sklearn.grid_search import GridSearchCV
params = dict(n_neighbors = list(range(1,13)))
print(params)
#grid_search
gsearch = GridSearchCV(estimator =clf,param_grid=params)
gsearch.fit(X,y)
print(gsearch.best_params_, gsearch.best_score_)


模型的调试目标是:平衡过拟合和欠拟合,通过GridSearch 比例搜索最佳的模型参数组合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: