使用sk-learn进行训练的通用模式

1、加载数据集
从datasets直接导入:

from sklearn import datasets
#如:加载训练集,波士顿房价
loaded_data = datasets.load_boston()
#加载样本的特征
data_X = loaded_data.data
#加载样本的标签
data_y = loaded_data.target

使用datasets生成:

#创建一个样品集,包含100和样本,特征数为一,标记为0,1,
X, y = datasets.make_regression(n_samples=100, n_features=1, n_targets=1, noise=10)
#绘制散点图
plt.scatter(X, y)
plt.show()

2、对样本集标准化

from sklearn import preprocessing
# 将每一列特征标准化为标准正态分布,注意,标准化是针对每一列而言的
X = preprocessing.scale(X)

3、对样本集分折、随机排序、交叉训练
train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和test data,形式为:

X_train,X_test, y_train, y_test = cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)

参数代表含义:
train_data:所要划分的样本特征集
train_target:所要划分的样本结果
test_size:样本占比,如果是整数的话就是样本的数量
random_state:是随机数的种子。

#把样本集分成5个部分,分别进行交叉训练,cv每次训练的折数,一般为10
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')

4、选择特定的算法

#以KNN算法为例
from sklearn.neighbors import KNeighborsClassifier
#选取knn算法
knn = KNeighborsClassifier()
#进行训练
knn.fit(X_train, y_train)

5、设置所用算法的一些参数、查看拟合的效果

    #选取线性回归算法,并进行拟合
    model = LinearRegression()
    model.fit(data_X, data_y)
    #打印预测结果并与真实值对比
    print(model.predict(data_X[:4, :]))
    print(data_y[:4])
    #打印每个特征前的系数Y=AX+B中的A
    print(model.coef_)
    #打印模型截距B
    print(model.intercept_)
    #打印模型所采用的参数
    print(model.get_params())
    #打印模型预测结果的得分
    print(model.score(data_X, data_y))  # R^2 coefficient of determination

6、寻找合适的参数、观察是否过拟合

from sklearn.learning_curve import  learning_curve
learning_curve(estimator, X, y, train_sizes=array([ 0.1  ,  0.325,  0.55 ,  0.775,  1.   ]),
cv=None, scoring=None, exploit_incremental_learning=False, n_jobs=1, pre_dispatch='all', verbose=0)

这个函数的作用为: 对于不同大小的训练集,确定交叉验证训练和测试的分数。一个交叉验证发生器将整个数据集分割k次,分割成训练集和测试集。不同大小的训练集的子集将会被用来训练评估器并且对于每一个大小的训练子集都会产生一个分数,然后测试集的分数也会计算。最后,对于每一个训练子集,运行k次之后的所有这些分数将会被平均。
参数代表含义:
estimator:所使用的分类器
X:array-like, shape (n_samples, n_features)
训练向量,n_samples是样本的数量,n_features是特征的数量
y:array-like, shape (n_samples) or (n_samples, n_features), optional
目标相对于X分类或者回归
train_sizes:array-like, shape (n_ticks,), dtype float or int
训练样本的相对的或绝对的数字,这些量的样本将会生成learning curve。如果dtype是float,他将会被视为最大数量训练集的一部分(这个由所选择的验证方法所决定)。否则,他将会被视为训练集的绝对尺寸。要注意的是,对于分类而言,样本的大小必须要充分大,达到对于每一个分类都至少包含一个样本的情况。
cv:int, cross-validation generator or an iterable, optional
确定交叉验证的分离策略
None,使用默认的3-fold cross-validation,
integer,确定是几折交叉验证,一个作为交叉验证生成器的对象,一个被应用于训练/测试分离的迭代器
verbose : integer, optional
控制冗余:越高,有越多的信息
返回值:
train_sizes_abs:array, shape = (n_unique_ticks,), dtype int
用于生成learning curve的训练集的样本数。由于重复的输入将会被删除,所以ticks可能会少于n_ticks.
train_scores/train_loss : array, shape (n_ticks, n_cv_folds)
在训练集上的分数/误差
test_scores/test_scores : array, shape (n_ticks, n_cv_folds)
在测试集上的分数/误差

train_sizes, train_loss, test_loss= learning_curve(
        SVC(gamma=0.01), X, y, cv=10, scoring='mean_squared_error',
        train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
#误差是负数用负号,对误差进行平均
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)
#画出误差曲线(可用于判断是否过拟合)
plt.plot(train_sizes, train_loss_mean, 'o-', color="r",
             label="Training")
plt.plot(train_sizes, test_loss_mean, 'o-', color="g",
             label="Cross-validation")
plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

另:

from __future__ import print_function
from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(knn.score(X_test, y_test))

from sklearn.cross_validation import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
#把样本集分成5个部分,分别进行交叉训练,cv每次训练的折数,一般为10
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
print(scores)

# this is how to use cross_val_score to choose model and configs #
from sklearn.cross_validation import cross_val_score
import matplotlib.pyplot as plt
k_range = range(1, 31)
k_scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
##    loss = -cross_val_score(knn, X, y, cv=10, scoring='mean_squared_error') # for regression
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') # for classification
    k_scores.append(scores.mean())

plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
plt.show()

7、保存/加载预测模型

from __future__ import print_function
from sklearn import svm
from sklearn import datasets

clf = svm.SVC()
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf.fit(X, y)

# 使用pickle保存模型
import pickle
# save
with open('save/clf.pickle', 'wb') as f:
    pickle.dump(clf, f)
# 加载模型
with open('save/clf.pickle', 'rb') as f:
   clf2 = pickle.load(f)
   print(clf2.predict(X[0:1]))

# 使用joblib保存模型
from sklearn.externals import joblib
# Save
joblib.dump(clf, 'save/clf.pkl')
# 加载模型
clf3 = joblib.load('save/clf.pkl')
print(clf3.predict(X[0:1]))
03-09 02:39