1.scikit-learn简介
scikit-learn是一个开源的Python库,通过统一的接口实现机器学习、预处理、交叉验证方法,具有易于安装、易于使用的特点。
导入scikit-learn库中常用模块的方法为:
2.特征提取代码
通过前面设计的特征提取方法,将正样本点和负样本点进行特征提取,得到一个data_train.txt文件,每一行包括4个特征值以及标签值。下面是读取数据的代码:
数据读取的结果如下所示,其中“negative obstacle”列中1代表该点为负障碍,0代表该点不是负障碍。
3.logistic回归模型
首先将特征提取的数据分为测试样本和训练样本,用于模型的训练与测试,代码如下:
代码的第3行调用了scikit-learn库model_selection模块的train_test_split函数,model_selection模块主要用于数据划分相关的操作,train_test_split函数用于将数据集划分为训练集和测试集,函数接口形式为:
其中部分参量:
train_data:待划分的样本数据;
train_target:待划分的对应样本数据的样本标签;
test_size:可以为:①在0~1之间的浮点数,表示样本占比(若test_size=0.3,则样本数据中有30%的数据作为测试数据,记入X_test,其余70%数据记入X_train,同时适用于样本标签);②整数,表示样本数据中有多少样本记入X_test中,其余样本记入X_train;
random_state:随机数种子,种子不同,每次采集的样本不一样;种子相同,采集的样本不变;
shuffle:是否打乱样本数据顺序,类型为bool,当shuffle=False时,不打乱样本数据顺序;当shuffle=True时,打乱样本数据顺序。
然后引入logistic回归模型,代码如下所示:
打印输出的结果如下所示:
其中,0表示非负障碍类别,1表示负障碍类别。非负障碍类别的精确度(precision)为0.98,召回率(recall)为0.96,F1分数(F1-score)为0.97,样本数(support)有815个;负障碍类别的精确度为0.83,召回率为0.91,F1分数为0.87,样本数有166个;整个分类器的准确率(accuracy)为0.95。
下面介绍logistic回归模型代码中引用的几个scikit-learn库函数。
1)LogisticRegression函数
代码的第2行调用了scikit-learn库linear_model模块的LogisticRegression函数,linear_model模块实现了各种线性模型,LogisticRegression函数为linear_model模块的一个常用函数,用来构建logistic回归分类器,使用样式如下:
其中,参量solver为一个字符串,指定了求解最优化问题的算法,可以为如下值:
'newton-cg':使用牛顿法;
'lbfgs':使用L-BFGS拟牛顿法;
'liblinear':使用liblinear方法;
'sag':使用Stochastic Average Gradient descent算法。
2)StratifiedKFold函数
代码的第4行调用了scikit-learn库model_selection模块的StratifiedKFold函数,用于构建k折交叉验证分层采样的子集,使用样式如下:
其中部分参量:
n_splits:k折交叉验证的折数,即k的大小,类型为int,默认=5,至少为2;
shuffle:类型为bool,表示在拆分成批次之前是否对每个类的样本进行打乱顺序,默认为False;
random_state:类型为int或RandomState实例,默认为None;当shuffle为True时,random_state会影响采样的顺序,从而控制每个类别的每个子集的随机性;否则,保留random_state为None,为多个函数调用传递可重复输出的int值。
3)cross_val_predict函数
代码的第6行调用了scikit-learn库model_selection模块的cross_val_predict函数,用于为每个输入数据生成在交叉验证数据集上的预测值,使用样式如下:
其中部分参量:
estimator:用来“预测”的分类器对象;
y:与输入给分类器的数据对应的标签真值,类型为数组,默认值为None;
cv:默认值为None,用于确定交叉验证子集分割策略。(www.daowen.com)
4)classification_report函数
代码的第11行调用了scikit-learn库metrics模块的classification_report函数,metrics模块包括评分功能、性能指标以及成对指标和距离计算,classification_report函数用于建立一个显示主要分类指标的文本报告,使用样式为:
其中部分参量:
y_true:一维数组,为实际标签值;
y_pred:一维数组,为分类器输出的估计值。
4.网格搜索法
接着采用网格搜索法进行参数整定,根据经验将初始参数选定在一定的范围内,GridSearchCV存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数,代码如下所示:
在logistic回归的基础上进行网格搜索法参数整定的代码如下:
打印输出的结果如下所示:
相比较仅使用logistic回归而言,加上网格搜索进行参数整定后,精确度、召回率、准确率均有所提升,其中准确率从0.95提升至0.96,这说明加入网格搜索进行参数整定后,模型分类准确率提高。但是网格搜索也具有其局限性,可能会因为步长太大而错过最优化的数据组合的取值,导致分类准确率降低。
下面介绍在logistic回归的基础上进行网格搜索法参数整定代码中的几个scikit-learn库函数。
1)GridSearchCV函数
代码的第6行调用了scikit-learn库model_selection模块的GridSearchCV函数,用于进行网格搜索,作用是找到使得机器学习算法效果达到最好的各类参数的集合,使用样式如下:
其中部分参量:
estimator:选择使用的分类器,并且传入除需要确定最佳的超参数之外的其他参数;
param_grid:需要最优化的超参数的取值,值为字典或者列表。字典里面的键代表estimator模型中可以设置的参数。
2)precision_score函数
代码的第21行调用了scikit-learn库metrics模块的precision_score函数,precision_score函数用于计算精确度(precision),使用样式为:
其中部分参量:
y_true、y_pred:同上述classification_report函数中介绍;
pos_label:当average='binary'和数据为二进制的类时,类型为str或int,默认为1,如果数据是多类或多标签的,则将被忽略,设置labels=[pos_label],并将仅报告该标签的分数;
average:对于多类/多标签目标,此参数是必需的;如果为None,则返回每个类型的分数,否则将确定对数据执行的“average”类型:binary、micro、macro、weighted或是samples。
5.另外两种算法代码和结果的简单介绍
SVM和随机森林模型用于上述数据的分类,代码及运算结果介绍如下。
1)SVM模型
SVM模型仅有以下代码语句与logistic回归模型不同,其他代码类似。
运行后,输出结果为:
代码的第2行调用了scikit-learn库svm模块的SVC函数,用于构建支持向量机分类器,使用样式为:
其中部分参量:
gamma:为“rbf”“poly”和“sigmoid”的核函数参数,可取scale,auto或者float数据,默认为“scale”;如果gamma='scale'(默认)被传递,则它将1/(n_features*X.var())用作gamma值,如果为'auto',则使用1/n_features。
2)随机森林模型
随机森林模型仅有以下代码语句与logistic回归模型不同,其他代码类似。
运行后,输出结果为:
代码的第2行调用了scikit-learn库ensemble模块的RandomForestClassifier函数,ensemble模块包括基于集成的分类、回归和异常检测方法,RandomForestClassifier函数用于构建随机森林分类器,使用样式为:
其中部分参量:
n_estimators:类型为int,默认=100,随机森林中决策树的数量;
criterion:随机森林中构建决策树时的特征评估标准,可选“gini”或“entropy”,默认值为“gini”。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。