我最近开始学习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
,因此无法进行性能检查。每当您要基于一组变量进行价格预测或预测时,这就是现实世界中发生的事情,您需要训练模型以使其达到峰值性能,然后使用它进行预测!如有疑问,请在评论中保留任何问题。