エラー解決

【書籍エラー解決】scikit-learnでpredictを行う際に「UserWarning: X does not have valid feature names…」がでたときの解決方法

この記事では、特定の書籍でのエラーについて解決方法をご紹介します。

インプレスより出版のスッキリわかるPythonによる機械学習入門です。

書籍内の記述と同じように記述しても、エラーが出てしまいます。

その解決方法と初心者の方に向けた補足説明をしています。

エラーの原因は、書籍のコードに問題がある場合に限らず、ユーザーの環境(Python またはライブラリのバージョンの違い)によるものなどさまざまです。

今回の解決方法は私の場合は解決できましたが、この記事の方法では解決できないことがあります。

その時はぜひコメントなどで質問してください。

エラーの状況

今回のエラー解決の対象書籍はこちら。

書籍内 P114の 第1部4章「機械学習の体験」>4.4.3新しいデータでの予測 >コード4-17 を実行すると、

UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names warnings.warn

というエラーが出ます。

機械学習のスクリプトでエラーが出ると絶望するかもしれませんが、解決方法は必ずあるので安心してください。

では、さっそく行ってみましょう!

環境

確認したときの環境は以下の通りです。

  • python3.9
  • pandas : 1.5.2
  • scikit-learn : 1.2.0

なお、書籍では Anaconda の JupyterLab を使用していますが、この記事では普通の Python(CPython)を PyCharm で実行しています。

この辺りの開発環境の違いは特に問題ありません。

また、実行時コマンドプロンプトでもシェルスクリプトでもOKです。

状況説明

P114のコード4-17「きのこかたけのこか予測する」を実行すると、エラーが出ます。

taro = [[170, 70, 20]]

model.predict(taro)

なお、本書はその都度必要なコードしか紹介されていませんが、この時点で必要なコードを全て揃えると以下のようになります。

import pandas as pd
from sklearn import tree

model = tree.DecisionTreeClassifier(random_state=0)

df = pd.read_csv('KvsT.csv')
xcol = ['身長', '体重', '年代']
x = df[xcol]
t = df['派閥']

model.fit(x, t)

taro = [[170, 70, 20]]

model.predict(taro)

初心者の方は、この時点で「なぜ?」となりますね。

コード4-1~4-16を参考に、必要なものを集めただけです。

何が必要で何が不要かが分からなかったという方は、上を参考にしてください。

エラーの原因

今回のエラーの原因は、モデルを作成した際の fitメソッド の記述

「model.fit(x, t)」

によるデータ型(データフレーム)と、新しく taro のデータを追加した際の

taro = [[170, 70, 20]]

のデータ型(リスト)が異なるためです。

解決方法

そこで、新しく追加する「taro」の情報をデータフレームに変えることで解決することができます。

その際、列(columns)の名前を適切に指定することでエラーは出なくなります。

import pandas as pd
from sklearn import tree

model = tree.DecisionTreeClassifier(random_state=0)

df = pd.read_csv('KvsT.csv')
xcol = ['身長', '体重', '年代']
x = df[xcol]
t = df['派閥']

model.fit(x, t)

taro = [[170, 70, 20]]
# データフレーム型に変換し、列名を指定
taro = pd.DataFrame(taro, columns=['身長', '体重', '年代'])

model.predict(taro)

なお、JupyterLab や Google Colab 以外の環境では、上記を実行しても結果が表示されません。

最後の

model.predict(taro)

を出力するために、

models = model.predict(taro)
print(models)

としてから実行しましょう。

['きのこ']

これで、書籍通り taro さんは「きのこ派」という判定がでました。

まとめ

無事にエラーが解決できたら嬉しいです。

「上手くいかない」「別のエラーが出た」などがありましたら、フォームやコメントでお知らせください。

それでは、ステキなPythonライフを!

Pythonの機械学習について詳しく知りたいという初学者には、こちらの書籍がおススメです。

ABOUT ME
papa3
某教育機関で現役の講師をしながら、ブログとYouTubeでプログラミングの情報を発信しています。個人でもウェブアプリケーション開発と運営をしながら本業収入<副業を目指しています!

POSTED COMMENT

  1. yutaka より:

    2024/03/17
    どストライクの内容でした。大変感謝です。
    googleで検索すると上の方にありました。
    同じ問題に向き合った方が多いのかな?
    ありがとうございます。

    • papa3 より:

      コメントいただき、ありがとうございます!
      お役に立てたようで嬉しく思います。
      エラー関係は情報のストックがありますが、記事にし切れていません。
      もし何かお困りのことがありましたら、いつでもお問い合わせください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です