本周的作业是使用sklearn库来进行一些简单的机器学习练习。
题目如下:
接下来,我们按照题目中给出的步骤来一步步完成这个练习。
1.创建一个样本量不小于1000,特征数不小于10的二元数据集。
因为要求的样本量比较大,所以我选择使用numpy.random.rand()函数来创建符合特定正态分布的样本特征,并分别把它们标记为0、1。
为了更好地检验之后机器学习算法得到的预测效果,在生成数据时我特意让0、1两类数据的正态分布有所区别。特别地,我让0类数据有标准差3,让1类数据有标准差4,并且规定这两类数据地均值都为0。这样一来,我们可以确定得到的数据有较好的可分性。
生成数据的代码如下:
dataset = [None,None]
# set seed so that the result can be reproduced
np.random.seed(0)
# generate positive feature of standard deviation 4.0
pos_features = 4.0 * np.random.rand(int(n_samples/2), n_features)
# generate negative feature of standard deviation 3.0
neg_features = 3.0 * np.random.rand(int(n_samples/2), n_features)
# generate labels
pos_label = np.ones(int(n_samples/2))
neg_label = np.zeros(int(n_samples/2))
# np.concatenate((pos_features, neg_features))
dataset[0] = np.concatenate((pos_features, neg_features))
dataset[1] = np.concatenate((pos_label, neg_label))
2.构建一个10折交叉检验数据集。
为了随机地把数据集分成10折进行交叉检验,我使用sklearn.model_selection.KFold来获取对应的训练、检验数据的下标。代码如下:
kf = KFold( n_splits=10, shuffle=True, random_state=1234)
for train_idx, test_idx in kf.split(dataset[0]):
# outer cross-validation
X_train, X_test = dataset[0][train_idx], dataset[0][test_idx]
y_train, y_test = dataset[1][train_idx], dataset[1][test_idx]
通过对KFold来获取相应数据的下表,我们可以快速地把数据集分成训练和检验两个部分。
3.分别使用高斯贝叶斯法、SVM和随机森林来进行训练、预测、效果评价
这一部分的内容,我们可以直接调用sklearn中的函数来对交叉数据集的每个分划进行训练和预测。
每次预测结束之后,我们要对以下三个指标进行评价:
1.准确率
2.f1值
3.AUC ROC值。
这三个评价指标都可以通过sklearn.metrics中对应的函数直接进行计算。
对这些函数的导入如下: