sckit-learnから取得できるデータセット一覧です。
自分でまとめるのがめんどうだったから、ChatGPT Chatに作成させています。
参考:公式 stable 1.9.1 の構成(scikit-learn)
scikit-learnには、機械学習の動作確認やアルゴリズムの比較に利用できるデータセットが用意されています。
from sklearn.datasets import load_wine
X, y = load_wine(return_X_y=True)
print(X.shape) # (178, 13)
print(y.shape) # (178,)
CSVファイルを自分で準備しなくても、これだけで学習用の X と教師データ y を取得できます。
sklearn.datasets は大きく分けると次のような構成になっています。
| 種類 | 主な関数 | 内容 |
|---|---|---|
| Toy datasets | load_* |
scikit-learnに同梱された小規模データ |
| Real world datasets | fetch_* |
実データをダウンロードして利用 |
| OpenML | fetch_openml() |
OpenML上のデータセットを取得 |
| Generated datasets | make_* |
条件を指定して人工データを生成 |
公式ドキュメントでは、データセットのロード・取得・生成という形で整理されています。公式ドキュメント
① load_*:scikit-learnに同梱されている標準データセット
scikit-learnが Toy datasets として提供している小規模な標準データセットは6種類あります。
外部サイトからダウンロードする必要がないため、ネットワーク接続なしでも利用できます。
| 関数 | 内容 | 件数 | 特徴量 | 主な用途 |
|---|---|---|---|---|
load_iris() |
アヤメ3品種の花びら・がくの測定値 | 150 | 4 | 多クラス分類 |
load_wine() |
ワインの化学分析値 | 178 | 13 | 多クラス分類・PCA |
load_breast_cancer() |
乳腺腫瘍の細胞核特徴 | 569 | 30 | 2値分類 |
load_digits() |
0〜9の手書き数字画像 | 1,797 | 64 | 画像分類 |
load_diabetes() |
糖尿病患者の身体・血液指標 | 442 | 10 | 回帰 |
load_linnerud() |
運動データと身体測定値 | 20 | 入力3 / 出力3 | 多出力回帰 |
Iris
機械学習のサンプルとして非常によく使われるデータセットです。
がくの長さ
がくの幅
花びらの長さ
花びらの幅
↓
Setosa / Versicolor / Virginica
4つの特徴量から、アヤメを3種類に分類します。
分類、PCA、クラスタリングなどの入門用データとして扱いやすいです。
Wine
ワインの化学分析結果から3種類のクラスを分類するデータセットです。
主な特徴量には以下のようなものがあります。
- アルコール
- リンゴ酸
- マグネシウム
- フラボノイド
- 色の濃さ
- プロリン
13個の特徴量があるため、分類だけでなく PCAによる次元圧縮 の実験にも使いやすいデータセットです。
from sklearn.datasets import load_wine
wine = load_wine()
print(wine.data.shape)
# (178, 13)
print(wine.target_names)
# ['class_0' 'class_1' 'class_2']
Digits
0〜9の手書き数字画像を分類するデータセットです。
1枚の画像サイズは 8×8ピクセル なので、
8 × 8 = 64特徴量
として扱われます。
from sklearn.datasets import load_digits
digits = load_digits()
print(digits.images.shape)
# (1797, 8, 8)
print(digits.data.shape)
# (1797, 64)
画像分類の基本的な実験にも利用できます。
Toy datasetsの詳細は公式ドキュメントを参照してください。Toy datasets
② fetch_*:ダウンロードして使う実データ
fetch_* 系は、実世界の比較的大きなデータセットを取得するための関数です。
初回実行時には基本的にデータをダウンロードします。
| 関数 | データ内容 | 分野 | 主な用途 |
|---|---|---|---|
fetch_california_housing() |
カリフォルニアの住宅・人口・所得など | 不動産 | 回帰 |
fetch_20newsgroups() |
20カテゴリのニュースグループ文章 | NLP | テキスト分類 |
fetch_20newsgroups_vectorized() |
20 Newsgroupsをベクトル化したデータ | NLP | テキスト分類 |
fetch_covtype() |
米国森林の地形・植生データ | 環境 | 多クラス分類 |
fetch_kddcup99() |
ネットワーク通信データ | セキュリティ | 異常検知・分類 |
fetch_lfw_people() |
人物の顔画像 | 画像 | 顔認識 |
fetch_lfw_pairs() |
2枚の顔画像のペア | 画像 | 同一人物判定 |
fetch_olivetti_faces() |
人物の顔画像 | 画像 | 顔分類 |
fetch_rcv1() |
Reutersのニュース記事 | NLP | マルチラベル分類 |
fetch_species_distributions() |
生物種の生息分布 | 生態学 | 分布予測 |
例えばCalifornia Housingなら、
from sklearn.datasets import fetch_california_housing
X, y = fetch_california_housing(
return_X_y=True
)
print(X.shape)
# (20640, 8)
住宅価格の回帰問題をすぐに試すことができます。
20 Newsgroups
NLPを試したい場合に便利なデータセットです。
20種類のニュースグループに投稿された文章が含まれており、
文章
↓
BoW
↓
TF-IDF
↓
分類モデル
↓
カテゴリ分類
といったテキスト分類の実験に利用できます。
KDDCup99
ネットワーク接続データを使ったデータセットです。
正常な通信と複数種類の攻撃通信が含まれているため、
ネットワーク通信
↓
特徴量
↓
正常 / 異常
といった異常検知やセキュリティ分野の機械学習実験に利用できます。
Real world datasetsについては公式ドキュメントを参照してください。公式ドキュメント
③ fetch_openml():OpenMLからデータセットを取得
fetch_openml() は少し特殊です。
特定の1種類のデータセットを取得する関数ではなく、OpenMLに公開されているさまざまなデータセットをscikit-learnから取得するための入口です。
from sklearn.datasets import fetch_openml
mnist = fetch_openml(
"mnist_784",
version=1,
as_frame=False
)
print(mnist.data.shape)
OpenMLには多数の公開データセットが登録されているため、
scikit-learn
↓
fetch_openml()
↓
OpenML
↓
任意の公開データセット
という形で利用できます。
そのため、fetch_openml() は「scikit-learnにデータが入っている」というより、外部データリポジトリへアクセスするための関数と考えたほうが分かりやすいです。
④ make_*:人工データを生成
機械学習アルゴリズムの動きを確認したい場合、個人的にはこの make_* 系がかなり便利だと思います。
条件を指定して、その場で人工的なデータセットを生成できます。
分類・クラスタリング
| 関数 | 生成するデータ | 主な用途 |
|---|---|---|
make_classification() |
任意の分類データ | 分類全般 |
make_blobs() |
島状に分布した点群 | クラスタリング |
make_moons() |
2つの半月状の点群 | 非線形分類 |
make_circles() |
二重円状の点群 | 非線形分類 |
make_gaussian_quantiles() |
ガウス分布を領域分割したデータ | 分類 |
make_hastie_10_2() |
10特徴量の2値分類データ | 分類・Boostingなど |
make_multilabel_classification() |
複数ラベルを持つデータ | マルチラベル分類 |
回帰
| 関数 | 生成するデータ | 主な用途 |
|---|---|---|
make_regression() |
任意の線形回帰データ | 回帰全般 |
make_friedman1() |
非線形回帰データ | 非線形回帰 |
make_friedman2() |
複雑な非線形回帰データ | 非線形回帰 |
make_friedman3() |
複雑な非線形回帰データ | 非線形回帰 |
make_sparse_uncorrelated() |
疎な回帰データ | 回帰 |
次元削減・Manifold Learning
| 関数 | 生成するデータ | 主な用途 |
|---|---|---|
make_s_curve() |
S字型の3次元点群 | 次元削減 |
make_swiss_roll() |
ロール状の3次元点群 | 次元削減 |
make_low_rank_matrix() |
低ランク行列 | PCA・SVD |
make_swiss_roll() は、次元削減アルゴリズムの違いを可視化するときに特に分かりやすいデータです。
from sklearn.datasets import make_swiss_roll
X, color = make_swiss_roll(
n_samples=1000,
noise=0.1,
random_state=42
)
print(X.shape)
# (1000, 3)
3次元のロール状データを2次元へ展開することで、Manifold Learningが何をしているのか視覚的に確認できます。
行列・分解・バイクラスタリング
| 関数 | 生成するデータ | 主な用途 |
|---|---|---|
make_sparse_coded_signal() |
スパース信号 | 辞書学習 |
make_biclusters() |
ブロック構造を持つ行列 | バイクラスタリング |
make_checkerboard() |
市松模様状の行列 | バイクラスタリング |
make_spd_matrix() |
対称正定値行列 | 共分散行列など |
make_sparse_spd_matrix() |
疎な対称正定値行列 | 共分散推定など |
以上が、scikit-learn 1.9.1のAPIに掲載されている主な make_* データ生成関数です。
make_* がアルゴリズムの可視化に便利
例えばSVMなどの非線形分類を試したい場合、
from sklearn.datasets import make_moons
X, y = make_moons(
n_samples=300,
noise=0.15,
random_state=42
)
だけで半月状の分類データを生成できます。
イメージとしては、
● ● ●
● ●
● ●
○ ○ ○
○ ○
○
のようなデータです。
線形モデルでは分離しにくく、カーネルSVMなどでは分離しやすいため、アルゴリズムの違いを確認する用途に向いています。
クラスタリングなら、
from sklearn.datasets import make_blobs
X, y = make_blobs(
n_samples=300,
centers=4,
cluster_std=1.0,
random_state=42
)
とするだけで、K-meansなどに使いやすい点群を生成できます。
つまり、
CSVを準備
↓
読み込み
↓
モデル学習
としなくても、
sklearn.datasets
↓
データ生成
↓
モデル学習
↓
可視化
までPythonコードだけで完結できます。
Bunch と return_X_y=True
load_* や fetch_* は通常、Bunch という辞書に似たオブジェクトを返します。
from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data)
print(iris.target)
print(iris.feature_names)
print(iris.target_names)
print(iris.DESCR)
多くの関数では、
X, y = load_iris(return_X_y=True)
とすることで、特徴量 X と教師データ y だけを直接取得できます。
単純にモデルへ渡したい場合はこちらの書き方が便利です。
その他のデータ読み込み関連関数
sklearn.datasets には、ここまで紹介したデータセット以外にもデータ読み込み用の関数があります。
| 関数 | 用途 |
|---|---|
load_files() |
ディレクトリ構造から分類用データを読み込む |
load_sample_image() |
scikit-learn付属のサンプル画像を読み込む |
load_sample_images() |
サンプル画像群を読み込む |
load_svmlight_file() |
SVMlight / LIBSVM形式を読み込む |
load_svmlight_files() |
複数のSVMlight / LIBSVM形式を読み込む |
fetch_file() |
URLからファイルを取得する |
そのため、厳密には load_* という名前の関数が6種類しかないわけではありません。
機械学習用の標準小規模データセットとして公式がToy datasetsに分類しているものが6種類、という理解になります。
まとめ
sklearn.datasets を調べてみると、単なる「サンプルデータ置き場」ではなく、
| やりたいこと | 使えるもの |
|---|---|
| とりあえず分類を試したい | load_iris() |
| 多次元データで分類・PCAを試したい | load_wine() |
| 回帰を試したい | load_diabetes() |
| 画像分類を試したい | load_digits() |
| NLPを試したい | fetch_20newsgroups() |
| 住宅価格予測を試したい | fetch_california_housing() |
| セキュリティ・異常検知を試したい | fetch_kddcup99() |
| 任意の分類データを作りたい | make_classification() |
| SVMの非線形分類を可視化したい |
make_moons() / make_circles()
|
| K-meansを試したい | make_blobs() |
| PCAなどの次元削減を試したい |
load_wine() / make_low_rank_matrix()
|
| Manifold Learningを試したい |
make_swiss_roll() / make_s_curve()
|
| 公開データセットを探したい | fetch_openml() |
と、かなり広い範囲をカバーしています。
簡単なアルゴリズムの検証であれば、毎回CSVを探したり作ったりする前に sklearn.datasets を確認してみるとよさそうです。