Hands-on Machine Learning with Scikit-Learn, Keras and TensorFlow (3rd edition)のCh2のエラーに対処

当サイトではアフィリエイト広告を利用しています

Hands-on Machine Learning with Scikit-Learn, Keras and TensorFlow (3rd edition)のCh.2において、ValueErrorがでてしまいました。

テキストや筆者のリポジトリとはnumpyやscipyのバージョンが異なることに起因するエラーだと思います。

一部のコードを修正すれば最近のライブラリのバージョンでも動作できたので、修正箇所を記録しておきます。

対象となるテキスト

現在改めて機械学習などの勉強中で、オライリーの「Hands-on Machine Learning with Scikit-Learn, Keras and TensorFlow (3rd edition)」を使って勉強しています。

2nd editionまでは日本語訳が出ているのですが、tensorflow2など最新のライブラリに対応している内容を知りたかったので原著の3rd editionをゆっくり読んでいます。

書籍と著者のGithubを併用して学習すると分かりやすいです。

利用環境

  • Python: 3.10.10
  • numpy: 1.24.3
  • scipy: 1.10.1
  • pandas: 2.0.1

元のコードとエラー内容

元となるコードはテキストのCh.2におけるHandling Text and Categorical Attributes内の以下の箇所です。

df_output = pd.DataFrame(cat_encoder.transform(df_test_unknown),
                    columns=cat_encoder.get_feature_names_out(),
                    index=df_test_unknown.index)

そのまま上記の環境で実行すると次のようなエラーが出てしまいます。

ValueError: Shape of passed values is (2, 1), indices imply (2, 5)

修正したコード

transform()の戻り値がsparse arrayであり、そのまま引数として与えるとエラーが出ているということみたいです。

手っ取り早いのは以下のようにtoarray()で明示的にndarrayに変換すれば期待通りに動作しました。

_data = cat_encoder.transform(df_test_unknown)
df_output = pd.DataFrame(_data.toarray(),
                    columns=cat_encoder.get_feature_names_out(),
                    index=df_test_unknown.index)

他のオプションなどでも対処可能かもしれませんが、テキストの内容を動作させるのであればこの程度で十分

今後も読み進める中でバージョン違いによるエラーは出てくるでしょうが、気付いたものは紹介したいと思います。