贷款预测系统报错:X无有效特征名但SVC拟合时含特征名
问题描述
搭建贷款数据集预测系统时,前期流程正常,但执行预测操作时出现以下警告:
/usr/local/lib/python3.8/dist-packages/sklearn/base.py:450: UserWarning: X does not have valid feature names, but SVC was fitted with feature names
warnings.warn("
对应的代码如下:
#importing the dependencies import numpy as np import pandas as pd import seaborn as sns from sklearn.model_selection import train_test_split from sklearn import svm from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler #importing the dataset to pandas loan_dataset= pd.read_csv('/content/train_u6lujuX_CVtuZ9i (1).csv') #printing the first five rows of the dataset loan_dataset.head() #statistical measures loan_dataset.describe() #number of values missing in each column loan_dataset.isnull().sum() #dropping missing values loan_dataset= loan_dataset.dropna() #number of values missing in each column loan_dataset.isnull().sum() #label_Encoding loan_dataset.replace({"Loan_Status": {"N":0,"Y":1}},inplace=True) #Dependent column values loan_dataset['Dependents'].value_counts() #replacing the value of 3+ to 4 loan_dataset= loan_dataset.replace(to_replace='3+', value=4) #Education & Loan Status sns.countplot(x="Education",hue="Loan_Status", data= loan_dataset) #marital status and loan status sns.countplot(x="Married",hue="Loan_Status", data= loan_dataset) #convert categorical columns to numerical values loan_dataset.replace({'Married':{'No':0,'Yes':1},'Gender':{'Male':1,'Female':0},'Self_Employed':{'No':0,'Yes':1}, 'Property_Area':{'Rural':0,'Semiurban':1,'Urban':2},'Education':{'Graduate':1,'Not Graduate':0}},inplace=True) #seperating the data and label X= loan_dataset.drop(columns=["Loan_ID","Loan_Status"],axis=1) Y= loan_dataset["Loan_Status"] print(X) print(Y) #training the dataset x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.1,stratify=Y,random_state=3) #importing the support vector algorithm classifier= svm.SVC(kernel="linear") #training the support vector machine model classifier.fit(x_train,y_train) #accuracy Score on training data x_train_prediction= classifier.predict(x_train) training_data_accuracy= accuracy_score(x_train_prediction,y_train) print("Accuracy on training data:", training_data_accuracy) #accuracy score on training data x_test_prediction = classifier.predict(x_test) test_data_accuray = accuracy_score(x_test_prediction,y_test) print('Accuracy on test data : ', test_data_accuray) #making a Predictive System input_data= (1,1,1,1,0, 4583,1508.0,128.0,360.0,1.0,0) #changing the input data to numpy array input_data_as_numpy_array= np.asarray(input_data) #reshaping the array as we are predicting for one instance input_data_reshaped= input_data_as_numpy_array.reshape(1,-1) data= input_data_reshaped prediction= classifier.predict(data)
问题原因与解决方案
原因
你的SVM模型是用带特征名称的DataFrame(x_train)训练的,但预测时传入的是没有特征名称的numpy数组,sklearn检测到这种特征标识的不一致,所以抛出警告。
解决方案
有两种可行的解决方式:
方法1:将输入数据转为带特征名称的DataFrame(推荐)
利用训练集x_train的列名,把输入数组包装成DataFrame,确保特征名称和训练时完全一致,同时还能避免因特征顺序错误导致的预测偏差:
# 替换原预测部分的代码 input_data= (1,1,1,1,0, 4583,1508.0,128.0,360.0,1.0,0) # 用训练集的列名创建DataFrame input_df = pd.DataFrame([input_data], columns=x_train.columns) prediction= classifier.predict(input_df)
方法2:关闭警告(不推荐,仅临时用)
如果你能100%确认输入特征的顺序和训练集完全一致,只是不想看到警告,可以添加代码屏蔽该提示:
import warnings warnings.filterwarnings("ignore", message="X does not have valid feature names")
内容的提问来源于stack exchange,提问作者Mutale Mwango
相关产品推荐
相关产品推荐

