sklearn相关积累

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011734144/article/details/84066722

sklearn的参考教程:

https://morvanzhou.github.io/tutorials/machine-learning/sklearn/3-5-save/

1、 解决的问题

分类、回归、聚类和特征降维

sklearn中有很多数据库可以用来练习

2、交叉验证: cross_val_score

作用:用来评估模型的准确性,基于准确性,选择最好的模型。

优势:一般的评估方法是取一部分数据用于训练,剩下的用来测试模型的准确性, 这种方法不太准确。 交叉验证则是把数据集分成N份,分别用N-1份来训练,剩下的一份来验证,这样总共排列组合N次,得到N个准确率, 然后取平均,这种评估模型的准确率的方法更靠谱

注意:交叉验证的过程并不是在训练我们定义的模型,它只是在评估模型

3、sklearn中模型训练情况的可视化

优势:可以观察训练过程中误差值的变化曲线,可以知道是过拟合还是欠拟合

代码:

from sklearn.learning_curve import learning_curve #学习曲线模块
from sklearn.svm import SVC #Support Vector Classifier
import matplotlib.pyplot as plt #可视化模块
import numpy as np

train_sizes, train_loss, test_loss = learning_curve(
    SVC(gamma=0.001), X, y, cv=10, scoring='mean_squared_error',
    train_sizes=[0.1, 0.25, 0.5, 0.75, 1])

#平均每一轮所得到的平均方差(共5轮,分别为样本10%、25%、50%、75%、100%)
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()

可以得到如下的损失曲线:

说明: 也可以用validation_curve曲线来观察

4、调参的策略、选模型的策略

利用matplotlib来绘制参数在不同的取值下模型的准确率或者损失值的变化曲线, 并选择最好的参数值

也可以用matplotlib来绘制不同的模型的准确率或者损失值的变化曲线,并选择最好的模型

5、保存模型

a) 使用pickle保存, 这是python自带的模型

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)

import pickle #pickle模块

#保存Model(注:save文件夹要预先建立,否则会报错)
with open('save/clf.pickle', 'wb') as f:
    pickle.dump(clf, f)

#读取Model
with open('save/clf.pickle', 'rb') as f:
    clf2 = pickle.load(f)
    #测试读取后的Model
    print(clf2.predict(X[0:1]))

b) 使用joblib保存,这是sklearn中的模块

from sklearn.externals import joblib #jbolib模块

#保存Model(注:save文件夹要预先建立,否则会报错)
joblib.dump(clf, 'save/clf.pkl')

#读取Model
clf3 = joblib.load('save/clf.pkl')

#测试读取后的Model
print(clf3.predict(X[0:1]))

两者的比较: joblib在使用上比较容易,读取速度也比pickle快

6、统计数量

all_data = pd.DataFrame(all_data, columns=all_columns)

print all_data['years'].count()     #统计非空值的数量

print len(all_data['years'])          #统计总的数量

print all_data[all_data['years'] >=0 ].count()   #统计years字段值大于等于0的数量

print all_data[all_data['years'] <0 ].count()     #统计years字段值小于0的数量, 如果某个case的值是Nan, 那么它即不符合>=0也不符合<0

猜你喜欢

转载自blog.csdn.net/u011734144/article/details/84066722