南山做网站关于枪,wordpress怎么安装老版编辑器,长沙旅游景点大全排名,开发app需要的技术#x1f935;♂️ 个人主页#xff1a;艾派森的个人主页 ✍#x1f3fb;作者简介#xff1a;Python学习者 #x1f40b; 希望大家多多支持#xff0c;我们一起进步#xff01;#x1f604; 如果文章对你有帮助的话#xff0c; 欢迎评论 #x1f4ac;点赞#x1f4… ♂️ 个人主页艾派森的个人主页 ✍作者简介Python学习者 希望大家多多支持我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 一、交叉验证简介 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证顾名思义就是重复的使用数据把得到的样本数据进行切分组合为不同的训练集和测试集用训练集来训练模型用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集某次训练集中的某样本在下次可能成为测试集中的样本即所谓“交叉”。 那么什么时候才需要交叉验证呢交叉验证用在数据不是很充足的时候。通常情况下如果数据样本量小于一万条我们就会采用交叉验证来训练优化选择模型。如果样本大于一万条的话我们一般随机的把数据分成三份一份为训练集Training Set一份为验证集Validation Set最后一份为测试集Test Set。用训练集来训练模型用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集最终决定使用哪个模型以及对应参数。 学习预测函数的参数并在相同数据集上进行测试是一种错误的做法: 一个仅给出测试用例标签的模型将会获得极高的分数但对于尚未出现过的数据它则无法预测出任何有用的信息。 这种情况称为 overfitting过拟合.。为了避免这种情况在进行机器学习实验时通常取出部分可利用数据作为 test set测试数据集 X_test, y_test。下面是模型训练中典型的交叉验证工作流流程图。通过网格搜索可以确定最佳参数。 k-折交叉验证得出的性能指标是循环计算中每个值的平均值。 该方法虽然计算代价很高但是它不会浪费太多的数据如固定任意测试集的情况一样 在处理样本数据集较少的问题例如逆向推理时比较有优势。 k-折交叉验证步骤 第一步不重复抽样将原始数据随机分为 k 份。第二步每一次挑选其中 1 份作为测试集剩余 k-1 份作为训练集用于模型训练。第三步重复第二步 k 次这样每个子集都有一次机会作为测试集其余机会作为训练集。在每个训练集上训练后得到一个模型用这个模型在相应的测试集上测试计算并保存模型的评估指标第四步计算 k 组测试结果的平均值作为模型精度的估计并作为当前 k 折交叉验证下模型的性能指标。
例如:
十折交叉验证
将训练集分成十份轮流将其中9份作为训练数据1份作为测试数据进行试验。每次试验都会得出相应的正确率。10次的结果的正确率的平均值作为对算法精度的估计一般还需要进行多次10折交叉验证例如10次10折交叉验证再求其均值作为对算法准确性的估计模型训练过程的所有步骤包括模型选择特征选择等都是在单个折叠 fold 中独立执行的。此外 多次 k 折交叉验证再求均值例如10 次10 折交叉验证以求更精确一点。数据量大时k设置小一些 / 数据量小时k设置大一些。 KFold和StratifiedKFold的使用 StratifiedKFold用法类似Kfold但是它是分层采样确保训练集测试集中各类别样本的比例与原始数据集中相同。这一区别在于当遇到非平衡数据时StratifiedKFold() 各个类别的比例大致和完整数据集中相同若数据集有4个类别比例是2:3:3:2则划分后的样本比例约是2:3:3:2但是KFold可能存在一种情况数据集有5类抽取出来的也正好是按照类别划分的5类也就是说第一折全是0类第二折全是1类等等这样的结果就会导致模型训练时没有学习到测试集中数据的特点从而导致模型得分很低甚至为0。 Parameters
n_splits : int, default3 也就是K折中的k值必须大于等于2shuffle : boolean True表示打乱顺序False反之random_state :int,defaultNone 随机种子如果设置值了shuffle必须为True # KFold
from sklearn.model_selection import KFold
kfolds KFold(n_splits3)
for train_index, test_index in kfolds.split(X,y):print(X_train:%s % X[train_index])print(X_test: %s % X[test_index])# StratifiedKFold
from sklearn.model_selection import StratifiedKFold
skfold StratifiedKFold(n_splits3)
for train_index, test_index in skfold.split(X,y):print(X_train:%s % X[train_index])print(X_test: %s % X[test_index]) KFold和StratifiedKFold实战案例
首先导入数据集本数据集为员工离职数据属于二分类任务 import pandas as pd
import warnings
warnings.filterwarnings(ignore)data pd.read_excel(data.xlsx)
data[薪资情况].replace(to_replace{低:0,中:1,高:2},inplaceTrue)
data.head() 拆分数据集为训练集和测试集测试集比例为0.2 from sklearn.model_selection import train_test_split
X data.drop(是否离职,axis1)
y data[是否离职]
X_train,X_test,y_train,y_test train_test_split(X,y,test_size0.2) 初始化一个分类模型这里用逻辑回归模型举例。方法1使用cross_val_score()可以直接得到k折训练的模型效果比如下面使用3折进行训练得分评估使用准确率关于scoring这个参数我会在文末介绍。 # 初始化一个分类模型比如逻辑回归
from sklearn.linear_model import LogisticRegression
lg LogisticRegression()
# 方法1
from sklearn.model_selection import cross_val_score
scores cross_val_score(lg,X_train,y_train,cv3,scoringaccuracy)
print(scores)
print(Accuracy: %0.2f (/- %0.2f) % (scores.mean(), scores.std() * 2)) 接下来分别使用KFold和StratifiedKFold其实两者代码非常类似只是前面的方法不同。
KFold # 方法2-KFold和StratifiedKFold
import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold
from sklearn.metrics import accuracy_score,recall_score,f1_score
# KFold
kfolds KFold(n_splits3)
accuracy_score_list,recall_score_list,f1_score_list [],[],[]
for train_index,test_index in kfolds.split(X_train,y_train):# 准备交叉验证的数据X_train_fold X_train.iloc[train_index]y_train_fold y_train.iloc[train_index]X_test_fold X_train.iloc[test_index]y_test_fold y_train.iloc[test_index]# 训练模型lg.fit(X_train_fold,y_train_fold)y_pred lg.predict(X_test_fold)# 评估模型AccuracyScore accuracy_score(y_test_fold,y_pred)RecallScore recall_score(y_test_fold,y_pred)F1Score f1_score(y_test_fold,y_pred)# 将评估指标存放对应的列表中accuracy_score_list.append(AccuracyScore)recall_score_list.append(RecallScore)f1_score_list.append(F1Score)# 打印每一次训练的正确率、召回率、F1值print(accuracy_score:,AccuracyScore,recall_score:,RecallScore,f1_score:,F1Score)
# 打印各指标的平均值和95%的置信区间
print(Accuracy: %0.2f (/- %0.2f) % (np.average(accuracy_score_list), np.std(accuracy_score_list) * 2))
print(Recall: %0.2f (/- %0.2f) % (np.average(recall_score_list), np.std(recall_score_list) * 2))
print(F1_score: %0.2f (/- %0.2f) % (np.average(f1_score_list), np.std(f1_score_list) * 2)) StratifiedKFold # StratifiedKFold
skfolds StratifiedKFold(n_splits3)
accuracy_score_list,recall_score_list,f1_score_list [],[],[]
for train_index,test_index in skfolds.split(X_train,y_train):# 准备交叉验证的数据X_train_fold X_train.iloc[train_index]y_train_fold y_train.iloc[train_index]X_test_fold X_train.iloc[test_index]y_test_fold y_train.iloc[test_index]# 训练模型lg.fit(X_train_fold,y_train_fold)y_pred lg.predict(X_test_fold)# 评估模型AccuracyScore accuracy_score(y_test_fold,y_pred)RecallScore recall_score(y_test_fold,y_pred)F1Score f1_score(y_test_fold,y_pred)# 将评估指标存放对应的列表中accuracy_score_list.append(AccuracyScore)recall_score_list.append(RecallScore)f1_score_list.append(F1Score)# 打印每一次训练的正确率、召回率、F1值print(accuracy_score:,AccuracyScore,recall_score:,RecallScore,f1_score:,F1Score)
# 打印各指标的平均值和95%的置信区间
print(Accuracy: %0.2f (/- %0.2f) % (np.average(accuracy_score_list), np.std(accuracy_score_list) * 2))
print(Recall: %0.2f (/- %0.2f) % (np.average(recall_score_list), np.std(recall_score_list) * 2))
print(F1_score: %0.2f (/- %0.2f) % (np.average(f1_score_list), np.std(f1_score_list) * 2)) 补充
scoring 参数: 定义模型评估规则
Model selection 模型选择和 evaluation 评估使用工具例如 model_selection.GridSearchCV 和 model_selection.cross_val_score 采用 scoring 参数来控制它们对 estimators evaluated 评估的估计量应用的指标。
常见场景: 预定义值 对于最常见的用例, 可以使用 scoring 参数指定一个 scorer object 记分对象; 下表显示了所有可能的值。 所有 scorer objects 记分对象遵循惯例 higher return values are better than lower return values较高的返回值优于较低的返回值。因此测量模型和数据之间距离的 metrics 度量如 metrics.mean_squared_error 可用作返回 metric 指数的 negated value 否定值的 neg_mean_squared_error 。
Scoring得分Function函数Comment注解Classification分类 ‘accuracy’metrics.accuracy_score ‘average_precision’metrics.average_precision_score ‘f1’metrics.f1_scorefor binary targets用于二进制目标‘f1_micro’metrics.f1_scoremicro-averaged微平均‘f1_macro’metrics.f1_scoremacro-averaged宏平均‘f1_weighted’metrics.f1_scoreweighted average加权平均‘f1_samples’metrics.f1_scoreby multilabel sample通过 multilabel 样本‘neg_log_loss’metrics.log_lossrequires predict_proba support需要 predict_proba 支持‘precision’ etc.metrics.precision_scoresuffixes apply as with ‘f1’后缀适用于 ‘f1’‘recall’ etc.metrics.recall_scoresuffixes apply as with ‘f1’后缀适用于 ‘f1’‘roc_auc’metrics.roc_auc_score Clustering聚类 ‘adjusted_mutual_info_score’metrics.adjusted_mutual_info_score ‘adjusted_rand_score’metrics.adjusted_rand_score ‘completeness_score’metrics.completeness_score ‘fowlkes_mallows_score’metrics.fowlkes_mallows_score ‘homogeneity_score’metrics.homogeneity_score ‘mutual_info_score’metrics.mutual_info_score ‘normalized_mutual_info_score’metrics.normalized_mutual_info_score ‘v_measure_score’metrics.v_measure_score Regression回归 ‘explained_variance’metrics.explained_variance_score ‘neg_mean_absolute_error’metrics.mean_absolute_error ‘neg_mean_squared_error’metrics.mean_squared_error ‘neg_mean_squared_log_error’metrics.mean_squared_log_error ‘neg_median_absolute_error’metrics.median_absolute_error ‘r2’metrics.r2_score