从实践的角度出发,机器学学习要做的工作就是在我们有的一个数据集上建立一个或者多个模型,然后对我们的模型进行优化和评估。我们将会在sklearn中看到下图各个模块到底是什么,怎么用。
(1)结构:
由图中,可以看到库的算法主要有四类:分类,回归,聚类,降维。其中:
常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN
常用降维:LinearDiscriminantAnalysis、PCA
(2)图片中隐含的操作流程:
这个流程图代表:蓝色圆圈内是判断条件,绿色方框内是可以选择的算法。你可以根据自己的数据特征和任务目标去找到一条自己的操作路线,一步步做就好了。
面对自己的任务肯定有自己的数据集,但是对于学习来说,sklearn提供了一些数据,主要有两部分:现在网上一些常用的数据集,可以通过方法加载;另一种sklearn可以生成数据,可以生成你设定的数据。(设定规模,噪声等)
一段python实例:
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# 使用以后的数据集进行线性回归(这里是波士顿房价数据)
loaded_data = datasets.load_boston()
#
data_X = loaded_data.data
data_y = loaded_data.target
model = LinearRegression()
model.fit(data_X, data_y)
print(type(data_X))
print(model.predict(data_X[:4, :]))
print(data_y[:4])
# n_samples表示样本数目,n_features特征的数目 n_tragets noise噪音
X, y = datasets.make_regression(n_samples=100, n_features=1, n_targets=1,noise=10)
plt.scatter(X, y)
plt.show()
数据预处理包括:降维、数据归一化、特征提取和特征转换(one-hot)等,这在sklearn里面有很多方法,具体查看api。这里用归一化(preprocessing.scale() )例子解释一下:
from sklearn import preprocessing # 进行标准化数据时,需要引入个包
import numpy as np
# sklearn.cross_validation在1.9版本以后就被弃用了,
# 1.9版本的以后的小伙伴可以用sklearn.model_selection就行了,
from sklearn.model_selection import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
X, y = make_classification(n_samples=300, n_features=2, n_redundant=0, n_informative=2,
random_state=22, n_clusters_per_class=1, scale=100)
# 数据标准化:尽量将数据转化为均值为0,方差为1的数据,形如标准正态分布(高斯分布)
X = preprocessing.scale(X)
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.3)
clf = SVC()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
a=np.array([[10,2.7,3.6],
[-100,5,-2],
[120,20,40]],dtype=np.float64)
print(a)# 标准化之前a
print(preprocessing.scale(a))# 标准化之后的a
sklearn里面有很多的机器学习方法,可以查看api找到你需要的方法,sklearn统一了所有模型调用的api,使用起来还是比较简单。
from sklearn import datasets
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#使用以后的数据集进行线性回归
loaded_data=datasets.load_boston()
data_X=loaded_data.data
data_y=loaded_data.target
model=LinearRegression()
model.fit(data_X,data_y)
print(model.predict(data_X[:4,:]))
print(data_y[:4])
# 参数
# 如果y=0.1x+0.3 则此行输出的结果为0.1
print(model.coef_)
# 此行输出的结果为0.3
print(model.intercept_)
# 模型定义时定义的参数,如果没有定义则返回默认值
print(model.get_params())
# 给训练模型打分,注意用在LinearR中使用R^2 conefficient of determination打分
print(model.score(data_X, data_y))
(1)模型的score方法
最简单的模型评估方法是调用模型自己的方法:
#预测
y_predict = knnClf.predict(x_test)
print("score on the testdata:",knnClf.score(x_test,y_test))
(2)sklearn的指标函数
库提供的一些计算方法,常用的有classification_report方法
下面是一个svm分类器,是关于图片分类的,具体数据这里没有给出,大家只需要关注模型的评估就好。
def svmClassify(x_train, x_test, y_train, y_test):
id = range(1, x_test.shape[0]+1)
print("start run svm!")
#训练
svc = svm.SVC(kernel='rbf', C=10,probability=True)
svc.fit(x_train, y_train)
#预测
y_predict = svc.predict(x_test)
print("svm mode's score on the test data:",svc.score(x_test,y_test))
print("svm mode's evaluate:",classification_report(y_test,y_predict))
# print(svc.coef_) # 如果y=0.1x+0.3 则此行输出的结果为0.1
# print(svc.intercept_) # 此行输出的结果为0.3
print(svc.get_params()) # 模型定义时定义的参数,如果没有定义则返回默认值
#可能性计算
probablity = svc.predict_proba(x_test)
list_pro = []
for i in range(probablity.shape[0]):
pro = max(list(probablity[i]))
list_pro.append(pro)
#输出
index = np.array(id).reshape(-1,1)
result = pd.DataFrame(np.column_stack((np.array(id).reshape(-1, 1),
np.array(y_test).reshape(-1, 1),
np.array(y_predict).reshape(-1,1),
np.array(list_pro).reshape(-1,1))),
columns=['ImageId','test_label','predict_lable','probablity'])
result.to_csv("result/svm_result.csv", index=False, header=True, encoding='gbk')
diff_index = []
for i in range(result.shape[0]):
# print(result['test_label'][i], result['predict_lable'][i],)
diff_index.append(result['test_label'][i] != result['predict_lable'][i])
print(diff_index)
diff = result[diff_index]
diff_x = x_test_original[diff_index]
diff.to_csv('result/svm_result_diff.csv', index=False, header=True, encoding='gbk')
# 查看每个错误
for i in range(len(diff_index)):
# print("label is:",diff['test_label'][i],"predict is:",diff['predict_lable'][i])
print("test label is :", diff.iloc[i]['test_label'],
'predict label is :', diff.iloc[i]['predict_lable'])
x = diff_x[i]
img = x.reshape(28, 28)
image_show(img)
(3)sklearn也支持自己开发评价方法
模型的保存与恢复可以采用python的pickle,也可以用joblib的方法。
from sklearn import datasets
from sklearn import svm
clf = svm.SVC()
iris = datasets.load_iris()
X, y = iris.data, iris.target
print(type(X))
clf.fit(X, y)
print("===========第一种保存模型方法================")
import pickle
pickle_path = 'model/clf.pickle'
with open(pickle_path,'wb') as f :
pickle.dump(clf, f)
with open(pickle_path,'rb') as f :
clf = pickle.load(f)
print(clf.predict(X[0:1]))
print("===========第二种保存模型方法================")
from sklearn.externals import joblib
joblib_path = 'model/clf.c=pkl'
joblib.dump(clf, joblib_path)
clf3 = joblib.load(joblib_path)
print(clf3.predict(X[0:1]))