预处理
model_selection模块
train_test_split
分割数据集为训练集和测试集
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=4)
cross_val_score
from sklearn.model_selection import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print(scores)
print(scores.mean())
[ 1. 0.93333333 1. 1. 0.86666667 0.93333333
0.93333333 1. 1. 1. ]
0.966666666667
分类器通用方法
iris = datasets.load_iris() # 导入dataset中的数据
iris_x = iris.data # 特征
iris_y = iris.target # 标签
#print(iris_x[:2, :])
train_x, test_x, train_y, test_y = train_test_split(iris_x, iris_y, test_size=0.3) # 把训练数据和测试数据分开
knn = KNeighborsClassifier() # 初始化一个机器学习算法
knn.fit(train_x, train_y) # 开始训练
print(knn.predict(test_x)) # 预测
print(knn.score(test_x, test_y)) # 预测的准确率
分类器
svm
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None, random_state=None)
-
C : float, optional (default=1.0)
Penalty parameter C of the error term.
C越大边界越复杂,会导致过拟合 -
kernel : string, optional (default=’rbf’)
kernel必须是[‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’]中的一个或者是一个可调用对象,默认为’rbf’。 -
gamma : float, optional (default=’auto’)
Kernel coefficient for ‘rbf’, ‘poly’ and ‘sigmoid’. If gamma is ‘auto’ then 1/n_features will be used instead.
“伽玛”参数实际上对 SVM 的“线性”核函数没有影响。 -
详情参考
-
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC
核方法简单来讲就是把低维空间线性不可分的向量(x, y)映射到高维空间的向量(x1,x2,x3.......xn)以达到线性可分的目的。这个说法不准确,但是就先这样理解吧。
参考https://www.zhihu.com/question/30371867/answer/73428260
先给个定义:核函数K(kernel function)就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常而言,m>>n)。<x, y>是x和y的内积(inner product),严格来说应该叫欧式空间的标准内积,也就是很多人常说的点积(dot product)。
光看这一段还是不明白kernel是什么,用来干什么的...对吧?不要急。一个好的知识分享者是不会把一篇空洞的定义扔下就不管的,TA会告诉你这个概念的intuition,然后给你举个小小的栗子,最后告诉你几个应用场景。Andrew Ng的Machine Learning为什么会成为一门现象级的MOOC?原因之一就是因为他除了是个学术上的大神,也同样是个极有质素的知识分享者。所以我要学习他。
好了,intuitively(这也模仿得太生硬了吧…),要计算<f(x), f(y)>,我们要先分别计算f(x)和f(y),然后再求它们的内积。上面的定义里也说了,经过映射后的x和y,维数大大增加,计算内积的成本可能会非常之大,而且在高位空间费力牛劲儿地计算内积,内积又是一个scalar,相当于说又把我们的计算从高维空间拉回到一维空间!所以我们特别想要一个“简便运算法”,帮助我们不需要奔向高维空间就能在家门口计算得到想要的内积。这时候该轮到我们的猪脚——kernel登场了,它能帮我们做到这一点。
举个小小栗子。
令 x = (x1, x2, x3, x4); y = (y1, y2, y3, y4);
令 f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4x2, x4x3, x4x4); f(y)亦然;
令核函数 K(x, y) = (<x, y>)^2.
接下来,让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8). 那么:
f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ;
f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ;
<f(x), f(y)> = 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024
= 4900.
好累,对不对?可谁让f(·)把四维空间的数据映射到十六维空间里呢?
如果我们用核函数呢?
K(x, y) = (5+12+21+32)^2 = 70^2 = 4900.
就是这样!
所以现在你看出来了吧,kernel其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。甚至,它能解决<b>无限维空间</b>无法计算的问题!因为有时f(·)会把n维空间映射到无限维空间去,对此我们常常束手无策,除非是用kernel,尤其是RBF kernel(K(x,y) = exp(-||x-y||^2) )。
在有kernel之前,做machine learning的典型的流程应该是:data --> features --> learning algorithm,但kernel给我们提供了一个alternative,那就是,我们不必定义从data到feature的映射函数,而是可以直接kernel(data) --> learning algorithm,也可以是data --> features --> kernel(features) --> learning algorithm。
所以虽然我们看到kernel常被应用在SVM(SVM中的kernel应该是后一种用法,后文再说),但其实要用到内积的learning algorithm都可以使用kernel。“用到内积的learning algorithm”其实并不少见,不信你可以想一想最普通不过的linear classifier/regressor有没有一个步骤是计算特征向量(feature vectors)。
<b>那么kernel在SVM究竟扮演着什么角色?</b>
初学SVM时常常可能对kernel有一个误读,那就是误以为是kernel使得低维空间的点投射到高位空间后实现了线性可分。其实不然。这是<b>把kernel和feature space transformation</b><b>混为了一谈</b>。(这个错误其实很蠢,只要你把SVM从头到尾认真推导一遍就不会犯我这个错。)
还是简单回顾一下吧。SVM就是 y = w'·φ(x) + b,其中φ(x)是特征向量(feature vectors),并且是φ(x)使得数据从低维投射到高位空间后实现了线性可分。而kernel是在解对偶问题的最优化问题时,能够使φ(x)更方便地计算出来,特别是φ(x)维数很高的时候。
决策树
用法
class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_split=1e-07, class_weight=None, presort=False)
-
min_samples_split : int, float, optional (default=2)
最小的分割数,大于这个数才进行下一步决策 -
详情参考
逻辑回归
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
print(cross_val_score(logreg, X, y, cv=10, scoring='accuracy').mean())
0.953333333333
线性回归
import pandas as pd
import numpy as np
from sklearn import metrics
from sklearn.linear_model import LinearRegression
data = pd.read_csv('http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv', index_col=0)
print(data.head())
TV Radio Newspaper Sales
1 230.1 37.8 69.2 22.1
2 44.5 39.3 45.1 10.4
3 17.2 45.9 69.3 9.3
4 151.5 41.3 58.5 18.5
5 180.8 10.8 58.4 12.9
import seaborn as sns
%matplotlib inline
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.7, kind='reg')
下载.png
feature_cols = ['TV', 'Radio', 'Newspaper']
X = data[feature_cols]
y = data.Sales
linreg = LinearRegression()
linreg.fit(X_train, y_train)
print(dict(zip(feature_cols, linreg.coef_)))
y_pred = linreg.predict(X_test)
print(y_test)
print(y_pred)
print(np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
{'TV': -0.15615389365322999, 'Radio': -0.021642394876836168, 'Newspaper': 0.23163615241203314}
[2 0 2 2 2 1 1 0 0 2 0 0 0 1 2 0 1 0 0 2 0 2 1 0 0 0 0 0 0 2 1 0 2 0 1 2 2
1 1 0 2 0 1 0 2 0 0 1 1 2 0 1 2 2 1 1 0 1 2 1]
[ 1.92960022 -0.05631468 1.75924226 1.96952322 1.75400957 1.34503136
1.55335259 -0.25708769 0.05337832 1.43933112 -0.01786772 0.0047061
-0.09797524 1.31073213 1.8414079 -0.09259126 0.96397191 -0.04484088
0.07419694 1.59020133 -0.11485066 1.89509647 1.32895025 0.10349746
0.02464997 -0.00894958 0.07087912 -0.03927615 -0.06582262 1.77961658
1.43655945 -0.00606188 1.74054079 -0.04857956 0.91115196 2.15514074
1.6936414 1.07190357 1.27772238 -0.05079703 1.96811189 -0.0496883
1.14322047 -0.11864257 1.99461128 -0.08938914 -0.05061628 1.28899166
1.28540427 1.69145953 -0.08308331 1.0171239 2.16207777 2.12726337
1.13745121 1.19236454 0.23135535 1.06899824 1.47599911 1.2114042 ]
0.212886736194
scores = cross_val_score(lm, X, y, cv=10, scoring='mean_squared_error')
print(scores)
mse_scores = -scores
rmse_scores = np.sqrt(mse_scores)
print(rmse_scores)
print(rmse_scores.mean())
[-3.56038438 -3.29767522 -2.08943356 -2.82474283 -1.3027754 -1.74163618
-8.17338214 -2.11409746 -3.04273109 -2.45281793]
[ 1.88689808 1.81595022 1.44548731 1.68069713 1.14139187 1.31971064
2.85891276 1.45399362 1.7443426 1.56614748]
1.69135317081
网友评论