【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目实战
1. 从零开始房产数据爬取实战第一次做房产数据爬取时我盯着满屏的HTML标签差点崩溃。但后来发现只要掌握几个关键技巧爬取房产网站数据其实比想象中简单得多。我们这次要爬取的是长沙二手房数据包含户型、面积、单价等21个关键字段。先说说requests库的使用心得。很多新手会直接get请求然后碰壁因为现在大部分网站都有基础反爬机制。我建议第一步就加上headers模拟浏览器访问import requests headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } url https://example.com/changsha # 替换为实际网址 response requests.get(url, headersheaders)解析环节我更推荐用BeautifulSoup它的find_all方法对新手特别友好。比如提取房源列表先用开发者工具查看网页结构找到包含房源的div的class名from bs4 import BeautifulSoup soup BeautifulSoup(response.text, html.parser) house_list soup.find_all(div, class_house-item) # 根据实际class调整处理分页时有个小技巧 - 观察URL规律。有的网站是page2这种参数有的是/2/这样的路径。我建议先用浏览器手动翻几页确认规律再写循环for page in range(1, 11): # 假设爬10页 page_url f{base_url}?page{page} # 发送请求和解析代码...数据存储环节要注意直接存CSV可能会遇到编码问题。我吃过亏现在都会显式指定utf-8编码import csv with open(houses.csv, w, encodingutf-8-sig, newline) as f: writer csv.writer(f) writer.writerow([户型, 面积, 单价]) # 表头 # 写入数据...2. 数据清洗的实战技巧拿到原始数据后千万别急着分析我早期项目90%的错误都源于清洗不到位。先说说时间字段处理房产网站的挂牌时间格式五花八门用pd.to_datetime的format参数最稳妥import pandas as pd df[挂牌时间] pd.to_datetime(df[挂牌时间], format%Y-%m-%d) # 根据实际格式调整区域拆分是个典型需求。比如岳麓区-梅溪湖这种格式用str.split最方便df[[所在区域, 具体区域]] df[区域].str.split(-, expandTrue) df df.drop(区域, axis1)处理异常值时别急着删除。我建议先做可视化观察分布。比如用箱线图看单价分布import matplotlib.pyplot as plt plt.boxplot(df[单价]) plt.show()缺失值处理要根据字段特性决定策略。数值型字段我常用中位数填充类别型用众数df[单价] df[单价].fillna(df[单价].median()) df[装修] df[装修].fillna(df[装修].mode()[0])3. 数据可视化实战心得做房产数据可视化时最容易犯的错误就是图表过于复杂。我总结出三个必看的视图首先是区域房价热力图用seaborn的heatmap展示各区域单价差异import seaborn as sns pivot_table df.pivot_table(index所在区域, values单价, aggfuncmean) sns.heatmap(pivot_table, annotTrue, fmt.0f)其次是户型分布饼图但要注意合并小占比项type_counts df[户型].value_counts() type_counts[type_counts 10] 其他 # 合并少于10条的户型 type_counts.plot.pie(autopct%.1f%%)最后是价格-面积散点图能直观发现异常房源plt.scatter(df[建筑面积], df[总价]) plt.xlabel(面积(㎡)) plt.ylabel(总价(万元))4. 房价预测模型构建选特征时别贪多我测试发现这5个特征效果最好所在区域、建筑面积、房龄、装修、有无电梯。先用LabelEncoder处理类别特征from sklearn.preprocessing import LabelEncoder le LabelEncoder() df[所在区域] le.fit_transform(df[所在区域])模型选择上随机森林比线性回归更适合房产数据from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split X df[[所在区域, 建筑面积, 房龄]] y df[总价] X_train, X_test, y_train, y_test train_test_split(X, y) model RandomForestRegressor(n_estimators100) model.fit(X_train, y_train)评估时别只看R2分数我习惯用MAE看绝对误差from sklearn.metrics import mean_absolute_error preds model.predict(X_test) print(fMAE: {mean_absolute_error(y_test, preds):.2f}万元)最后保存模型时建议把特征编码器一起保存import joblib joblib.dump({model: model, encoder: le}, house_price_model.pkl)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2450018.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!