算法筛查(spot checking)用来发现可以很好解决机器学习问题的算法。在着手做之前,你永远也不知道哪种算法最契合你的数据。因此你必须尝试大量的算法,找出一个最有潜力的算法,继续深入挖掘。本文中会展示七种适用于回归问题的算法,我们可以使用scikit-learn进行算法筛查。其中包括4个线性算法和3个非线性算法。
四个线性算法
- Linear Regression
- Ridge Regression
- LASSO Linear Regression
- Elastic Net Regression
三个非线性算
- K-Nearest Neighbors
- Classification and Regression Trees
- Support Vector Machines
所有算法均使用Boston House Price数据集. 这是一个回归问题,自变量为数值型。使用10 fold的交叉验证来筛查算法,使用均方误差来衡量算法表现。
算法介绍:
- 线性回归假设输入变量为高斯分布,假设输入变量与输出变量存在相关,输入变量彼此间非高相关(共线性问题)。使用sklearn的LinearRegression类来实现该算法。
- 脊回归是线性回归算法的拓展,通过改进损失函数来最小化模型复杂度(使用相关系数的the sum squared value)(也叫做 l2-norm),使用sklearn的Ridge类来实现该算法。
- LASSO (The Least Absolute Shrinkage and Selection Operator)回归,与脊回归类似,通过改进损失函数来最小化模型复杂度(使用相关系数的the sum squared value)(也叫做 l1-norm),使用sklearn的Lasso来实现该算法。
- ElasticNet 是一种正则化的回归,其组合了脊回归和Lasso的属性。使用 l2-norm (sum squared coefficient values) 和the l1-norm (sum absolute coefficient values)来惩罚模型,最小化模型复杂度,使用sklearn的ElasticNet来实现该算法。
- K-Nearest Neighbors (or KNN) 为新数据实例确定K个最相似的实例。K个实例的均值或者中位数作为预测值。需要注意的是:距离的量度指标,Minkowski是默认值,是 Euclidean distance (used when all inputs have the same scale) 和Manhattan distance (for when the scales of the input variables differ的拓展。使用sklearn的KNeighborsRegressor 来实现该算法。
- 决策树或者分类、回归树 (CART) 使用训练数据选择最优点去分类数据,使损失最小(mean squared errort为默认的损失量度)。使用sklearn的DecisionTreeRegressor来实现该算法。
- 支持向量机用于二值分类问题,该技术被拓展到预测问题中,就是支持向量回归(SVR),SVR 建立在LIBSVM库上。使用sklearn的SVR来实现该算法。
代码实现:
import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
def bulid_model(model_name):
model = model_name()
return model
scoring = 'neg_mean_squared_error'
for model_name in [LinearRegression,Ridge,Lasso,ElasticNet,KNeighborsRegressor,DecisionTreeRegressor,SVR]:
model = bulid_model(model_name)
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print(results.mean())
输出结果:
<class 'sklearn.linear_model.base.LinearRegression'> mean accuracy:-34.7052559445
<class 'sklearn.linear_model.ridge.Ridge'> mean accuracy:-34.0782462093
<class 'sklearn.linear_model.coordinate_descent.Lasso'> mean accuracy:-34.4640845883
<class 'sklearn.linear_model.coordinate_descent.ElasticNet'> mean accuracy:-31.1645737142
<class 'sklearn.neighbors.regression.KNeighborsRegressor'> mean accuracy:-107.28683898
<class 'sklearn.tree.tree.DecisionTreeRegressor'> mean accuracy:-37.9357619608
<class 'sklearn.svm.classes.SVR'> mean accuracy:-91.0478243332
知识点:
- LinearRegression,Ridge,Lasso,ElasticNet from sklearn.linear_model
- sklearn.neighbors.KNeighborsRegressor
- sklearn.tree.DecisionTreeRegressor
- sklearn.svm.SVR
**原文链接: **Spot-Check Regression Machine Learning Algorithms in Python with scikit-learn