如何对新数据使用 Decision Tree Regressor? (Python, Pandas, Sklearn)

How do I use Decision Tree Regressor on new data? (Python, Pandas, Sklearn)

我最近开始学习 python 和机器学习。我一直在做一个涉及房价的基本决策树回归示例。所以我已经训练了算法并找到了最佳分支数,但我如何在新数据上使用它?

我有以下几列,我的目标值是 'SalePrice'

['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']

显然,对于原始数据,我已经有了 SalePrice,因此我可以比较这些值。如果我只有上面的列,我将如何找到价格?

完整代码如下

import pandas as pd
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor


# Path of the file to read
iowa_file_path = 'train.csv'

home_data = pd.read_csv(iowa_file_path)
#Simplify data to remove useless info
SimpleTable=home_data[['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd','SalePrice']]
# Create target object and call it y # input target value
y = home_data.SalePrice 
# Create X input columns names to be analysed
features = ['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']
X = home_data[features]

# Split into validation and training data
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=0, test_size=0.8, train_size=0.2)


# Specify Model
iowa_model = DecisionTreeRegressor(random_state=0)
# Fit Model
iowa_model.fit(train_X, train_y)

# Make validation predictions and calculate mean absolute error
val_predictions = iowa_model.predict(val_X)

val_mae = mean_absolute_error(val_predictions, val_y)
print("Validation MAE: {:,.0f}".format(val_mae))


def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(val_X)
    mae = mean_absolute_error(val_y, preds_val)
    return(mae)

# to find best number of leaves
candidate_max_leaf_nodes = [10, 20, 50, 100, 200, 400] # start with big numbers are work your way down
for max_leaf_nodes in candidate_max_leaf_nodes:
    my_mae=get_mae(max_leaf_nodes,train_X,val_X,train_y,val_y)
    print("MAX leaf nodes: %d \t\t Mean Absolute Error:%d" %(max_leaf_nodes,my_mae))




scores = {leaf_size: get_mae(leaf_size, train_X, val_X, train_y, val_y) for leaf_size in candidate_max_leaf_nodes}

best_tree_size = min(scores, key=scores.get)
print(best_tree_size)


#run on all data and put back into data fram 
final_model=DecisionTreeRegressor(max_leaf_nodes=best_tree_size,random_state=0)
final_model.fit(X,y)
final_model.predict(X)

final_predictions = final_model.predict(X)
finaltableinput = {'Predicted_Price':final_predictions}
finaltable = pd.DataFrame(finaltableinput)
SimpleTable.head()

jointable = SimpleTable.join(finaltable)

#export data with predicted values to csv
jointable.to_csv('newdata4.csv')




提前致谢

如果您想知道给定独立变量 (X) 的价格 (Y) 以及已经训练好的模型,您需要使用 predict() 方法。这意味着基于您的算法在训练中开发的模型,它将使用变量来预测 SalePrice。我看到您已经在代码中使用了 .predict()

您应该从定义变量开始,例如:

X_new = df_new[['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']] #Let's say this is a pandas dataframe
new_sale_price = final_model.predict(X_new) #This will return an array
df_new['SalePrice'] = new_sale_price #The length will be of equal length so you should have no trouble.

你也可以做到这一点:

df_new['SalePrice'] = final_model.predict(X_new) 

当然,由于您不知道 真实值 SalePrice X 的那些值,因此您无法进行性能检查。每当您想根据一组变量预测或预测价格时,这就是现实世界中发生的情况,您需要训练您的模型以达到其最佳性能,然后用它进行预测!有疑问欢迎在评论中留言。

决策树算法是一种监督学习模型,这意味着为了对其进行训练,您还必须为模型提供特征数据作为目标的(在您的情况下为'Sale Price')。

如果您想在没有目标数据的情况下应用机器学习,则必须使用无监督模型。

可以找到对这些不同类型的学习模型的非常基本的介绍 here