KNN 邻近 - 回归算法

# coding: utf-8

# In[1]:


import pandas as pd
import numpy as np
import os
from sklearn.preprocessing import StandardScaler


# In[2]:


#指定工作路径
os.chdir('/Users/a1/Downloads/百度云盘/机器学习算法配套案例实战/K近邻')


# In[3]:


#导入csv文件
dc_listings = pd.read_csv('listings.csv')
#指定features
features = ['accommodates', 'bedrooms', 'bathrooms', 'beds', 'price', 'minimum_nights', 'maximum_nights', 'number_of_reviews']
#定义features为DataFrame的列
dc_listings = dc_listings[features]
#清洗数据集,去除价格的$符合
dc_listings['price'] = dc_listings.price.str.replace("\$|,", '').astype(float)
#清洗数据集,去除带有空单元格的行
dc_listings = dc_listings.dropna()
#对所有特征做标准化
dc_listings[features] = StandardScaler().fit_transform(dc_listings[features])
normalized_listings = dc_listings
#打印DataFrame的行列属性
print(dc_listings.shape)


# In[4]:


#打印DataFrame的表头head()
dc_listings.head()


# In[5]:


#切分数据集
norm_train_df = normalized_listings.copy().iloc[0:2792]
norm_test_df = normalized_listings.copy().iloc[2792:]


# In[6]:


#调包算距离
from scipy.spatial import distance

first_listing = normalized_listings.iloc[0][['accommodates', 'bathrooms']]
fifth_listing = normalized_listings.iloc[20][['accommodates', 'bathrooms']]
first_fifth_distance = distance.euclidean(first_listing, fifth_listing)

first_fifth_distance


# In[9]:


#增加一列预测价格  注意apply函数的使用, test_df中的每一条数据都对应一条预测的价格
#test_df['predicted_price'] = test_df.accommodates.apply(predict_price, feature_column = 'accommodates')


# In[10]:


#多变量KNN模型
def predict_price_multivariate(new_listing_value, feature_columns):
    temp_df = norm_train_df
    temp_df['distance'] = distance.cdist(temp_df[feature_columns], [new_listing_value[feature_columns]])
    temp_df = temp_df.sort_values('distance')
    knn_5 = temp_df.price.iloc[:5]
    predicted_price = knn_5.mean()
    return predicted_price

cols = ['accommodates', 'bathrooms']
norm_test_df['predicted_price'] = norm_test_df[cols].apply(predict_price_multivariate,feature_columns=cols,axis=1)    
norm_test_df['squared_error'] = (norm_test_df['predicted_price'] - norm_test_df['price'])**(2)
mse = norm_test_df['squared_error'].mean()
rmse = mse ** (1/2)
print(rmse)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值