0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sklearn.datasetsで使えるデータセット・取得関数・生成関数一覧

0
Posted at

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にデータが入っている」というより、外部データリポジトリへアクセスするための関数と考えたほうが分かりやすいです。

OpenMLからのデータ取得


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_* データ生成関数です。

sklearn.datasets API


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コードだけで完結できます。


Bunchreturn_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 を確認してみるとよさそうです。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?