想要一直做一个完整的机器学习工程已经好久了,这篇博客呢,我会用到决策树,随机森林,svm,xgboost,投票法等方法。对波士顿的房价进行预测。本篇博客不会对相关原理进行解释,如果想要了解各个算法的原理,请阅读李航的统计机器学习,周志华的机器学习,以及陈天奇的XGBoost: A Scalable Tree Boosting System 和相关博客
部分代码参考利用python进行数据分析
其实在研一上数据挖掘课程的时候,老师就强烈推荐了sklearn这个包,当时数理知识还不是很强,学的算法也不是很明白,面对着1000多页的sklearn文档实在是令人望而生畏。这几天重新捡起来看了一点,发现sklearn的设计者们实在是太牛了!!不过还是期待市面上早日出现一本关于sklearn的书,如果能像利用python进行数据那本书写的一样好就可以了。
建议如果大家学了传统的机器学习算法之后,强烈推荐看看sklearn的文档,还有一些相关的重要参数。即使调包我们也要调的漂亮。嘿嘿。。。
在个人对 sklearn 的api的学习过程中,我觉得很有意义也是最漂亮的就是sklearn中的就是他的estimator,predictor,transform这三个接口了,结合pipeline 还有featureUnion 简直无敌。进行数据预处理的时候,管道设计实在是太人性化了。
sklearn 关于pipeline的应用的官方实例是给了一个20新闻集团语料库的例子,这个源代码对于初学者肯定特别不友好,所以我另外找了一个关于波士顿房价数据集的作为说明。我这也相当于又复习了一遍。(声明:这个完整机器学习项目并非我的原创,是我从github上下载的一个英文实例项目,但它做的比较浅,所以数据预处理部分的转换器我又重新设计了一下,而且没有进行调参和用集成学习的方法去做,我准备在后面加一些关于自己的esemble的东西,并顺变做一些ROC,F1-score,调参方法的测试等内容)
做这个的时候不由想到之前京东金融的面试,问我会选取哪些特征变量作为双十一预测客户是否会购买很多的特征变量。当时是在是太紧张了,就答了一个消费等级、消费金额。也有一部分原因是特征工程做的太少的原因,不管怎样,要一直练习下去呀。
突然悟到:
在找特征的过程中我们应该从时间特征(时间段、时间点)、地域特征(是否市区,人口密度)、身份(是否学生,消费能力等级,年龄层次)等等。
数据的获取(如何从某个链接网页上获取数据)
首先二话不说先送上下载数据的代码:
import os
import tarfile
from six.moves import urllib
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml/master/"
HOUSING_PATH = os.path.join("datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"
def fetch_data(housing_url = HOUSING_URL,housing_path = HOUSING_PATH):
if not os.path.isdir(housing_path):
os.makedirs(housing_path)
tgz_path = os.path.join(housing_path,"housing_tgz")
urllib.request.urlretrieve(housing_url,tgz_path)
housing_tgz = tarfile.open(tgz_path)
housing_tgz.extractall(path=housing_path)
housing_tgz.close()
os,tarfile的含义很容易理解。urllib其实也是做爬虫的时候经常用到的一个库。含义很容易理解在此就不做额外说明了。
Step2 读取数据
fetch_housing_data()
import pandas as pd
def load_housing_data(housing_path=HOUSING_PATH):
csv_path = os.path.join(housing_path, "housing.csv")
return pd.read_csv(csv_path)
housing = load_housing_data()
housing.head()
我们由此可以得到一些关于数据集前6行的信息,有一些经度纬度,人口,房屋总数的数据,收入中位数的数据,我们要预测的是房价中位数。
首先我们要划分测试集和训练集
这里提供了俩种方法,一种是用numpy的permutation方法
import numpy as np
# For illustration only. Sklearn has train_test_split()
def split_train_t