科学数据处理 —— 统计学习简述
科学数据处理 —— 统计学习简述
统计学习
随着实验数据地爆炸式增长,机器学习越来越重要了。它处理的问题可以建立预测模型,也可以学习无标注的数据。
这个简述将探索统计学习方法,以统计推断为目标的机器学习推断帮助我们利用手边的数据得到了一些结论。
Scikit-learn集成了一些经典的科学数据处理库(NumPy, SciPy, matplotlib)。
模型对象
(Estimators objects,个人觉得estimator还是翻译成模型吧)
训练:est.fit(data)
模型参数(训练前参数,模型固有,不因数据而改变)
>>> estimator = Estimator(param1=1, param2=2)
>>> estimator.param1
1
被估计参数(训练后参数,因训练而产生的参数结果)
>>> estimator.estimated_param_
监督学习
K-近邻分类器
最近邻可能是最简单的分类器,给定一个观测值X_test,找离它最近的训练数据样本,两个样本的结果y就是一致的。谁离我最近谁就跟我最像。
KNN分类器示例:
>>> # Split iris data in train and test data
>>> # A random permutation, to split the data randomly
>>> np.random.seed(0)
>>> indices = np.random.permutation(len(iris_X))
>>> iris_X_train = iris_X[indices[:-10]]
>>> iris_y_train = iris_y[indices[:-10]]
>>> iris_X_test = iris_X[indices[-10:]]
>>> iris_y_test = iris_y[indices[-10:]]
>>> # Create and fit a nearest-neighbor classifier
>>> from sklearn.neighbors import KNeighborsClassifier
>>> >>> knn = KNeighborsClassifier()
>>> knn.fit(iris_X_train, iris_y_train) KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=5, p=2, weights='uniform')
>>> knn.predict(iris_X_test) array([1, 2, 1, 0, 0, 0, 2, 1, 2, 0])
>>> iris_y_test array([1, 1, 1, 0, 0, 0, 2, 1, 2, 0])
线性模型
糖尿病数据集:
442个病人的10个心理变量,和其一年后的糖尿病指数。
>>> diabetes = datasets.load_diabetes()
>>> diabetes_X_train = diabetes.data[:-20]
>>> diabetes_X_test = diabetes.data[-20:]
>>> diabetes_y_train = diabetes.target[:-20]
>>> diabetes_y_test = diabetes.target[-20:]
线性回归:
是最简单的模型形式,利用训练数据来调节参数,使得残差和尽可能得低。
line_y_xb.png>>> from sklearn import linear_model
>>> regr = linear_model.LinearRegression()
>>> regr.fit(diabetes_X_train, diabetes_y_train) LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> # The mean square error
>>> np.mean((regr.predict(diabetes_X_test)-diabetes_y_test) ** 2) 2004.56760268...
>>> # Explained variance score: 1 is perfect prediction
>>> # and 0 means that there is no linear relationship
>>> # between X and y.
>>> regr.score(diabetes_X_test, diabetes_y_test)
0.5850753022690...
Shrinkage:
为了解决高方差的问题,防止过拟合,高维统计学习的一个方法是缩减回归系数到0:任意两个随机选择的样本集可能是不相关的。这种方法叫做岭回归(Ridge regression)。
>>> regr = linear_model.Ridge(alpha=.1)
>>> plt.figure()
>>> np.random.seed(0)
>>> for _ in range(6):
... this_X = .1 * np.random.normal(size=(2, 1)) + X ... regr.fit(this_X, y) ... plt.plot(test, regr.predict(test)) ... plt.scatter(this_X, y, s=3)
ridge.png
这是一个偏差和方差权衡的例子(bias/variance tradeoff),alpha(code中是0.1)的值越大,bias偏差就越大,方差就越小,从而解决过拟合的问题。bias/variance tradeoff 是统计学习非常重要的一点,我会专门在解读ISL(或ESL)的时候讨论。
参数可以这么设计(调参):
alphas = np.logspace(-4, -1, 6)
对于模型来说,有些特征是很有价值的,而一些特征对于这个问题是毫无价值的,所以我们需要设置这个特征的系数为0。岭回归会减少这些无用特征的作用,但不是把它们的系数设置为0。另外一个惩罚方式叫Lasso(最少收缩和选择操作),它是可以把系数设置为0。这种方法叫sparse,这种方法是奥卡姆剃刀(越简单越好)的一种应用。
>>> regr = linear_model.Lasso()
>>> scores = [regr.set_params(alpha=alpha ... ).fit(diabetes_X_train, diabetes_y_train ... ).score(diabetes_X_test, diabetes_y_test) ... for alpha in alphas]
>>> best_alpha = alphas[scores.index(max(scores))]
>>> regr.alpha = best_alpha
>>> regr.fit(diabetes_X_train, diabetes_y_train) Lasso(alpha=0.025118864315095794, copy_X=True, fit_intercept=True, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
>>> print(regr.coef_) [ 0. -212.43764548 517.19478111 313.77959962 -160.8303982 -187.19554705 69.38229038 508.66011217 71.84239008]
一个问题,不同算法(计算模型的参数)
不同算法可以用来解决相同的数学问题,比如Lasso可以用梯度下降法,在大规模数据集上是有效的。然而scikit-learn提供的LassoLars使用了LARS算法,它对于参数向量非常稀疏的情况下(少量观测数据)是有效的。