scikit-learn的主要模块和基本使用
2016-02-10 23:34
501 查看
转载自:简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法。
首先,数据应该被载入内存中。
scikit-learn的实现使用了NumPy中的arrays,所以,我们要使用NumPy来载入csv文件。
以下是从UCI机器学习数据仓库中下载的数据。
我们要使用该数据集作为例子,将特征矩阵作为X,目标变量作为y。
特征选择时一个很需要创造力的过程,更多的依赖于直觉和专业知识,并且有很多现成的算法来进行特征的选择。
下面的树算法(Treealgorithms)计算特征的信息量:
结果:
LogisticRegression(C=1.0,class_weight=None,dual=False,fit_intercept=True,
intercept_scaling=1,penalty=l2,random_state=None,tol=0.0001)
precisionrecallf1-scoresupport
avg/total0.770.770.77768
[[44753]
[120148]]
引言
对于一些开始搞机器学习算法有害怕下手的小朋友,该如何快速入门,这让人挺挣扎的。在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法。
加载数据(DataLoading)
我们假设输入时一个特征矩阵或者csv文件。首先,数据应该被载入内存中。
scikit-learn的实现使用了NumPy中的arrays,所以,我们要使用NumPy来载入csv文件。
以下是从UCI机器学习数据仓库中下载的数据。
importnumpyasnp importurllib.request #urlwithdataset url="http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data" #downloadthefile raw_data=urllib.request.urlopen(url) #loadtheCSVfileasanumpymatrix dataset=np.loadtxt(raw_data,delimiter=",") #separatethedatafromthetargetattributes X=dataset[:,0:7] y=dataset[:,8]
我们要使用该数据集作为例子,将特征矩阵作为X,目标变量作为y。
数据归一化(DataNormalization)
大多数机器学习算法中的梯度方法对于数据的缩放和尺度都是很敏感的,在开始跑算法之前,我们应该进行归一化或者标准化的过程,这使得特征数据缩放到0-1范围中。scikit-learn提供了归一化的方法:fromsklearnimportpreprocessing
#normalizethedataattributes
normalized_X=preprocessing.normalize(X)
#standardizethedataattributes
standardized_X=preprocessing.scale(X)
特征选择(FeatureSelection)
在解决一个实际问题的过程中,选择合适的特征或者构建特征的能力特别重要。这成为特征选择或者特征工程。特征选择时一个很需要创造力的过程,更多的依赖于直觉和专业知识,并且有很多现成的算法来进行特征的选择。
下面的树算法(Treealgorithms)计算特征的信息量:
fromsklearnimportmetrics
fromsklearn.ensembleimportExtraTreesClassifier
model=ExtraTreesClassifier()
model.fit(X,y)
#displaytherelativeimportanceofeachattribute
print(model.feature_importances_)
算法的使用
scikit-learn实现了机器学习的大部分基础算法,让我们快速了解一下。逻辑回归
大多数问题都可以归结为二元分类问题。这个算法的优点是可以给出数据所在类别的概率。fromsklearnimportmetrics
fromsklearn.linear_modelimportLogisticRegression
model=LogisticRegression()
model.fit(X,y)
print(model)
#makepredictions
expected=y
predicted=model.predict(X)
#summarizethefitofthemodel
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
结果:
LogisticRegression(C=1.0,class_weight=None,dual=False,fit_intercept=True,
intercept_scaling=1,penalty=l2,random_state=None,tol=0.0001)
precisionrecallf1-scoresupport
0.00.790.890.84500
1.00.740.550.63268
avg/total0.770.770.77768
[[44753]
[120148]]
朴素贝叶斯
这也是著名的机器学习算法,该方法的任务是还原训练样本数据的分布密度,其在多类别分类中有很好的效果。fromsklearnimportmetrics
fromsklearn.naive_bayesimportGaussianNB
model=GaussianNB()
model.fit(X,y)
print(model)
#makepredictions
expected=y
predicted=model.predict(X)
#summarizethefitofthemodel
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
结果:
GaussianNB()
precisionrecallf1-scoresupport
0.00.800.860.83500
1.00.690.600.64268
avg/total0.760.770.76768
[[42971]
[108160]]
k近邻
k近邻算法常常被用作是分类算法一部分,比如可以用它来评估特征,在特征选择上我们可以用到它。fromsklearnimportmetrics
fromsklearn.neighborsimportKNeighborsClassifier
#fitak-nearestneighbormodeltothedata
model=KNeighborsClassifier()
model.fit(X,y)
print(model)
#makepredictions
expected=y
predicted=model.predict(X)
#summarizethefitofthemodel
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
结果:
KNeighborsClassifier(algorithm=auto,leaf_size=30,metric=minkowski,
n_neighbors=5,p=2,weights=uniform)
precisionrecallf1-scoresupport
0.00.820.900.86500
1.00.770.630.69268
avg/total0.800.800.80768
[[44852]
[98170]]
决策树
分类与回归树(ClassificationandRegressionTrees,CART)算法常用于特征含有类别信息的分类或者回归问题,这种方法非常适用于多分类情况。fromsklearnimportmetrics
fromsklearn.treeimportDecisionTreeClassifier
#fitaCARTmodeltothedata
model=DecisionTreeClassifier()
model.fit(X,y)
print(model)
#makepredictions
expected=y
predicted=model.predict(X)
#summarizethefitofthemodel
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
结果:
DecisionTreeClassifier(compute_importances=None,criterion=gini,
max_depth=None,max_features=None,min_density=None,
min_samples_leaf=1,min_samples_split=2,random_state=None,
splitter=best)
precisionrecallf1-scoresupport
0.01.001.001.00500
1.01.001.001.00268
avg/total1.001.001.00768
[[5000]
[0268]]
支持向量机
SVM是非常流行的机器学习算法,主要用于分类问题,如同逻辑回归问题,它可以使用一对多的方法进行多类别的分类。fromsklearnimportmetrics
fromsklearn.svmimportSVC
#fitaSVMmodeltothedata
model=SVC()
model.fit(X,y)
print(model)
#makepredictions
expected=y
predicted=model.predict(X)
#summarizethefitofthemodel
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
结果:
SVC(C=1.0,cache_size=200,class_weight=None,coef0=0.0,degree=3,gamma=0.0,
kernel=rbf,max_iter=-1,probability=False,random_state=None,
shrinking=True,tol=0.001,verbose=False)
precisionrecallf1-scoresupport
0.01.001.001.00500
1.01.001.001.00268
avg/total1.001.001.00768
[[5000]
[0268]]
除了分类和回归算法外,scikit-learn提供了更加复杂的算法,比如聚类算法,还实现了算法组合的技术,如Bagging和Boosting算法。
如何优化算法参数
一项更加困难的任务是构建一个有效的方法用于选择正确的参数,我们需要用搜索的方法来确定参数。scikit-learn提供了实现这一目标的函数。下面的例子是一个进行正则参数选择的程序:
importnumpyasnp
fromsklearn.linear_modelimportRidge
fromsklearn.grid_searchimportGridSearchCV
#preparearangeofalphavaluestotest
alphas=np.array([1,0.1,0.01,0.001,0.0001,0])
#createandfitaridgeregressionmodel,testingeachalpha
model=Ridge()
grid=GridSearchCV(estimator=model,param_grid=dict(alpha=alphas))
grid.fit(X,y)
print(grid)
#summarizetheresultsofthegridsearch
print(grid.best_score_)
print(grid.best_estimator_.alpha)
结果:
GridSearchCV(cv=None,
estimator=Ridge(alpha=1.0,copy_X=True,fit_intercept=True,max_iter=None,
normalize=False,solver=auto,tol=0.001),
estimator__alpha=1.0,estimator__copy_X=True,
estimator__fit_intercept=True,estimator__max_iter=None,
estimator__normalize=False,estimator__solver=auto,
estimator__tol=0.001,fit_params={},iid=True,loss_func=None,
n_jobs=1,
param_grid={‘alpha’:array([1.00000e+00,1.00000e-01,1.00000e-02,1.00000e-03,
1.00000e-04,0.00000e+00])},
pre_dispatch=2*n_jobs,refit=True,score_func=None,scoring=None,
verbose=0)
0.282118955686
1.0