Scikit学习处理来自以2D数组表示的一个或多个数据集的学习信息。它们可以被理解为多维观察的列表。我们说这些阵列的第一个轴是样本轴,而第二个轴是特征轴。
scikit:iris数据集附带的一个简单示例
>>>fromsklearnimportdatasets>>>iris=datasets.load_iris()>>>data=iris.data>>>data.shape(150,4)它由150个鸢尾观察组成,每个由4个特征描述:它们的萼片和花瓣的长度和宽度,详见iris.DESCR。
当数据最初不是形状时,需要进行预处理才能被scikit学习使用。(n_samples,n_features)
重新组合数据的示例将是数字数据集
数字数据集由手写数字的17978×8图像组成
>>>digits=datasets.load_digits()>>>digits.images.shape(1797,8,8)>>>importmatplotlib.pyplotasplt>>>plt.imshow(digits.images[-1],cmap=plt.cm.gray_r)
所有估计器对象都会公开一个fit采用数据集(通常为2-d数组)的方法:
>>>estimator.fit(data)估计器参数:估计器的所有参数可以在实例化时设置,或通过修改相应的属性:
>>>estimator=Estimator(param1=1,param2=2)>>>estimator.param11估计参数:当数据与估计器配合时,根据手头的数据估算参数。所有估计的参数是以下划线结尾的估计对象的属性:
>>>estimator.estimated_param_监督学习:从高维观察中预测输出变量在监督学习中解决了这个问题
词汇:分类和回归
如果预测任务是将一组有限标签中的观测值进行分类,换句话说,将“观察到”对象命名为该任务,则该任务被称为分类任务。另一方面,如果目标是预测连续的目标变量,那么这被称为回归任务。
在scikit学习中进行分类时,y是整数或字符串的向量。
虹膜分类:
虹膜数据集是一个分类任务,包括从花瓣和萼片长度和宽度确定3种不同类型的虹膜(Setosa,Versichelour和Virginica):
培训集和测试集
在对任何学习算法进行实验的同时,重要的是不要测试估计器对用于拟合估计器的数据的预测,因为这不会评估估计器对新数据的性能。这就是为什么数据集通常被分为列车和测试数据。
KNN(k最近邻)分类示例:
糖尿病数据集
糖尿病数据组包括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:]手头的任务是预测生理变量的疾病进展。
>>>fromsklearnimportlinear_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)>>>print(regr.coef_)[0.30349955-237.63931533510.53060544327.73698041-814.13170937492.81458798102.84845219184.60648906743.5196167576.09517222]>>>#Themeansquareerror>>>np.mean((regr.predict(diabetes_X_test)-diabetes_y_test)**2)2004.56760268...>>>#Explainedvariancescore:1isperfectprediction>>>#and0meansthatthereisnolinearrelationship>>>#betweenXandy.>>>regr.score(diabetes_X_test,diabetes_y_test)0.5850753022690...收缩如果每个维度上的数据点很少,则观测值中的噪声会导致高方差:
>>>regr=linear_model.Ridge(alpha=.1)>>>plt.figure()>>>np.random.seed(0)>>>for_inrange(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)这是偏差/方差折衷的一个例子:脊alpha参数越大,偏差越高,方差越小。
我们可以选择alpha最小化遗漏错误,这次使用糖尿病数据集而不是我们的合成数据:
>>>alphas=np.logspace(-4,-1,6)>>>from__future__importprint_function>>>print([regr.set_params(alpha=alpha...).fit(diabetes_X_train,diabetes_y_train,...).score(diabetes_X_test,diabetes_y_test)foralphainalphas])[0.5851110683883...,0.5852073015444...,0.5854677540698...,0.5855512036503...,0.5830717085554...,0.57058999437...]注意
配件只有功能1和2
注意
完整的糖尿病数据集的表示将涉及11个维度(10个特征维度和目标变量之一)。很难在这种表现上形成一种直觉,但是请记住,这将是一个相当空白的空间,这可能是有用的。
我们可以看到,虽然功能2在整个模型上具有很强的系数,但它在y功能1考虑的时候传达了很少的信息。
>>>regr=linear_model.Lasso()>>>scores=[regr.set_params(alpha=alpha...).fit(diabetes_X_train,diabetes_y_train...).score(diabetes_X_test,diabetes_y_test)...foralphainalphas]>>>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.43764548517.19478111313.77959962-160.8303982-0.-187.1955470569.38229038508.6601121771.84239008]不同的算法相同的问题
多类分类
如果您有几个类来预测,通常使用的选项是适合一对所有分类器,然后使用投票启发式进行最终决策。
收缩和稀疏与逻辑回归
行使
尝试用最近的邻居和线性模型对数字数据集进行分类。留下最后10%,并对这些观察结果进行测试。
例:
>>>fromsklearnimportsvm>>>svc=svm.SVC(kernel='linear')>>>svc.fit(iris_X_train,iris_y_train)SVC(C=1.0,cache_size=200,class_weight=None,coef0=0.0,decision_function_shape=None,degree=3,gamma='auto',kernel='linear',max_iter=-1,probability=False,random_state=None,shrinking=True,tol=0.001,verbose=False)警告
归一化数据
对于包含SVM的许多估计器,具有每个特征的单位标准偏差的数据集对于获得良好的预测是重要的。
在特征空间中,类并不总是线性分离。解决方案是构建不是线性的但可以是多项式的决策函数。这是通过使用内核技巧来完成的,可以通过将内核定位在观察结果上来创建决策能量:
尝试从具有SVM的虹膜数据集中分类1和2类,具有2个第一个特征。排除每个类别的10%,并对这些观察结果进行测试预测。
警告:课程是有序的,不要遗漏最后的10%,你只能在一个班上进行测试。
提示:您可以使用decision_function网格上的方法来获得直觉。