scikit-learnの「valid feature names」警告
scikit-learn 1.0以降で発生する「X does not have valid feature names, but ~ was fitted with feature name」という警告について解説します。この警告はモデルの学習と予測でデータの形式が一貫していない場合に表示されます。
問題の原因
この警告は、以下のような状況で発生します:
- モデルを**データフレーム(feature namesあり)**で学習させた
- 予測時には**値のみの配列(feature namesなし)**を渡している
- データの特徴量名の型が正しくない(np.strではなくstrである必要がある)
WARNING
この警告はエラーではなく警告なので、処理は続行されます。ただし、データの順序が学習時と一致しているか確認する必要があります。
解決方法
方法1: データフレームを一貫して使用する(推奨)
学習時と予測時の両方でデータフレームを使用するのが最も安全な方法です。
python
import pandas as pd
from sklearn.ensemble import IsolationForest
# 学習データ(データフレーム)
X_train = pd.DataFrame({
'feature1': [1, 2, 3, 4, 5],
'feature2': [0.1, 0.2, 0.3, 0.4, 0.5]
})
# モデル学習
model = IsolationForest()
model.fit(X_train)
# 予測データ(データフレーム - 同じ特徴量名を持つ)
X_test = pd.DataFrame({
'feature1': [6, 7],
'feature2': [0.6, 0.7]
})
# 警告なしで予測
predictions = model.predict(X_test)
方法2: 値のみを使用する
学習時と予測時の両方で.values
を使用してnumpy配列を渡す方法です。
python
# 学習データを値のみで使用
model.fit(X_train.values)
# 予測も値のみで行う
predictions = model.predict([[6, 0.6], [7, 0.7]])
方法3: 特徴量名の型を確認する
特徴量名がnp.str
型ではなく、通常のstr
型であることを確認します。
python
# 問題がある場合
feature_names = ds.feature.values # np.str型になる可能性あり
# 修正後
feature_names = ds.feature.values.tolist() # str型のリストを確保
具体例
DecisionTreeClassifierの場合
python
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
# データ準備
X = pd.DataFrame({'age': [25, 30, 35], 'income': [50000, 60000, 70000]})
y = [0, 1, 0]
# モデル学習(データフレームで学習)
model = DecisionTreeClassifier()
model.fit(X, y)
# 予測(配列で予測 - 警告発生)
predictions = model.predict([[28, 55000]])
python
# 方法A: 両方データフレーム使用
X_train = pd.DataFrame({'age': [25, 30, 35], 'income': [50000, 60000, 70000]})
X_test = pd.DataFrame({'age': [28], 'income': [55000]})
model.fit(X_train, y)
predictions = model.predict(X_test)
# 方法B: 両方値を使用
model.fit(X.values, y)
predictions = model.predict([[28, 55000]])
既存のモデルを使用する場合
既に学習済みのモデル(pickleファイルなど)がある場合、予測時には正しい特徴量名を持つデータフレームを作成します。
python
# 特徴量名のリストを取得(モデルごとに異なる)
feature_names = ["age", "income", "gender"] # 実際の特徴量名に置き換え
# 予測用データを作成
new_data = pd.DataFrame([[25, 50000, 1]], columns=feature_names)
predictions = model.predict(new_data)
まとめ
scikit-learnの「valid feature names」警告は、データの形式の不一致によって発生します。以下のいずれかの方法で解決できます:
- 一貫性を持たせる:学習と予測で同じデータ形式(ともにデータフレームまたはともに配列)を使用する
- 特徴量名を確認する:特徴量名が正しい型(str)であることを確認する
- データフレームを使用する(推奨):特徴量名があることでデータの意図しない順序変更を防げる
データフレームを使用する方法は、特征量の順序が正しいことを保証し、コードの可読性も向上させるため、最も安全なアプローチです。