对于机器学习,我们最先需要获取数据集。一般上,广告投放也是基于机器学习去分析用户对什么事务感兴趣(有时候用户在不经意间的搜索、对话等过程中会透露),然后再对其喜好的事务进行广告投放。那么这个机器学习的数据集就来自公司产品的用户生成内容(UGC)。还有的情况是公司之间通过合作或协议,开放接口进行数据分享,让两家不同的公司同时享有共同数据。所以现实生活中会出现我在 A 平台说过这个东西,在 B 平台的广告会推送相关产品。

对于初学者,很多时候我们都没法获得大厂中的数据集,但是学习机器学习,我们可以通过一些国内外的机构所开源的数据集进行操作,去了解它的核心思路。常见的数据集有:

  1. Kaggle https://www.kaggle.com/datasets
  2. UCI Machine Learning Repository https://archive.ics.uci.edu/
  3. Scikit learn https://scikit-learn.org/stable/datasets/toy_dataset.html

Scikit-learn 数据集

对于初学者来说,我们可以使用 scikit learn 进行学习。scikit learn 包含了许多知名的机器学习算法的实现,文档完善,易于上手,并拥有丰富的 API。

Scikit-learn 包含了以下

  1. Classification 归类
  2. Regression 回归
  3. Clustering 聚类
  4. Dimensionality reduction 降维
  5. Model Selection 模型选择
  6. Prepossessing 预处理

我们可以通过

pip install Scikit-learn

来安装 Scikit-learn 库。

sklearn 数据集

当我们安装好之后,我们可以访问 scikit-learn 中的数据集。使用 sklearn.datasets 可以加载流行的数据集。

  1. load_*()
    1. * 表示需要加载的数据集,如 iris
    2. 获取小规模的数据集,数据包含在 datasets 里
    3. 常用的数据集有:
      1. load_iris() 鸢尾花数据集
      2. load_boston() 波斯顿房价
  2. fetch_*(data_home=None)
    1. 获取大规模的数据集,需要从网络上下载,函数的第一个参数是 data_home,表示数据集下载的目录。默认是 ~/scikit_learn_data/
    2. 比如说 fetch_20newsgroups(data_home=None, subset="train")
      1. subset 可选值为:train 训练集, test 测试集, all 全部 选择要加载的数据集

sklearn 数据集的使用

鸢尾花数据集中,特征值有四个:花瓣、花萼的长度、宽度;目标值有三个:setosa,vericolor,virginica

调用 fetch / load 都会返回一个 Bunch (字典格式)类型数据。它的键 key 有:

  • data: 特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
  • target: 标签数组,是 n_samples 的一维 numpy.ndarray 数组
  • DESCR: 数据描述
  • feature_names: 特征名,(新闻数据、手写数字、回归数据集没有)
  • target_names: 标签名
from sklearn.datasets import load_iris

# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值为:\n", iris)
# 返回值是一个继承自字典的 Bunch
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)

拿到的数据可不可以全部用来训练模型?不行,因为训练模型的步骤其中一项是模型评估,假设我们将所有数据都拿去训练模型了,那就没有多余的数据进行模型评估,也就没有办法知道这个模型的质量了。为此我们需要保留一部分数据用于训练,构建模型;一份后续做检验模型时用,用于评估模型是否有效。一般上保留比例为:

方式一 方式二 方式三
训练集 70% 80% 75%
测试集 30% 20% 30%

在 sklearn 进行划分

sklearn.model_selection.train_test_split(arrays, options*)

  • x 数据集的特征值
  • y 数据集的目标值
  • test_size 测试集的大小,一般为 float
  • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
  • return 返回值:训练集特征值,测试集特征值,训练集目标值,测试集目标值。
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size = 0.2, random_state = 22)