Я пытаюсь построить дерево регрессии без использования библиотеки sklearn.Вот как я пытаюсь выполнить задачу.
df_train = pd.read_csv('user/assignment2/data/housing_price_train.csv')
df = df_train[['OverallQual','GrLivArea','GarageArea','TotalBsmtSF','1stFlrSF','FullBath','TotRmsAbvGrd','YearBuilt','SalePrice']]
st_sale = np.std(df.SalePrice)
over, less = [],[]
std_r = {}
for c in median:
over = df.SalePrice.loc[df[c] > df[c].median()]
less = df.SalePrice.loc[df[c] <= df[c].median()]
std_over = np.std(over)
std_less = np.std(less)
p_over = over.count()/len(df)
p_less = less.count()/len(df)
result = p_over*std_over + p_less*std_less
result = st_sale - result
std_r[c] = result
del std_r['SalePrice']
std_r = sorted(std_r.items(), key=lambda x: x[1],reverse=True)
std_r
test = pd.read_csv('user/assignment2/data/housing_price_test.csv')
test= test[['OverallQual','GrLivArea','GarageArea','TotalBsmtSF','1stFlrSF','FullBath', 'TotRmsAbvGrd', 'YearBuilt']]
def predict_price(row):
df_part = df
for split_cond in std_r:
col = split_cond[0]
if row[col] < np.median(df_part[col]):
if not df_part.empty:
df_part = df_part.loc[ df_part[col]<np.median(df_part[col]) ]
else:
if not df_part.empty:
df_part = df_part.loc[ df_part[col]>=np.median(df_part[col]) ]
return np.mean(df_part['SalePrice'])
def predict_all(test_df):
ids = []
predictions = []
for i in range(len(test)):
row = test.iloc[i,:]
predicted_price = predict_price(row)
ids.append(i)
predictions.append(predicted_price)
return ids, predictions
def createSubmission(test_ids, predictions):
sub = pd.DataFrame()
sub['Id'] = test_ids
sub['SalePrice'] = predictions
sub.to_csv('user/assignment2/submission.csv',index=False)
def main():
ids, predictions = predict_all(test)
createSubmission(ids, predictions)
if __name__ == '__main__':
main()
Выходные данные для std_r: [('QualQual ', 24169.639457317156), (' GrLivArea ', 18442.815198341486), (' YearBuilt ', 14193.29356392668), (' GarageArea ', 13759, 1333339, 13759, 1333339, 13759)«1stFlrSF», 12427.210763854717), («TotalBsmtSF», 12327.533408498653), («TotRmsAbvGrd», 11091.35232613662), («FullBath», 5381.883704447857)]
на 1006 * на 1007 * 1007уменьшите df и в конце возьмите среднее значение оставшихся продажных цен.Это дает мне некоторые нулевые значения в моем окончательном файле CSV, что не должно происходить