(LogisticRegression模型在训练过程中考虑了所有训练样本对参数的影响)
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,linear_model,cross_validation,svm
%matplotlib inline
iris=datasets.load_iris()
iris=datasets.load_iris()
X_train = iris.data #data 表示数据
y_train = iris.target
这里采用分层采样
X_train,X_test,y_train,y_test=cross_validation.train_test_split(X_train,y_train,test_size=0.25,random_state=0,stratify=y_train)
print(X_train[0:1])
print(y_train[0:1])
测试结果为:
[[ 5. 2. 3.5 1. ]] [1]
cls=svm.LinearSVC()
cls.fit(X_train,y_train)
print('各特征权重:%s,截距:%s'%(cls.coef_,cls.intercept_))
print("算法评分:%.2f" % cls.score(X_test,y_test))
运行结果:
各特征权重:[[ 0.20959286 0.39923917 -0.8173906 -0.44231852] [-0.12834361 -0.78761976 0.52065888 -1.02288195] [-0.80306777 -0.87608965 1.21359445 1.81016988]],截距:[ 0.11973591 2.04247594 -1.44408633] 算法评分:0.97
#预测值
predict=cls.predict(X_test)
print(predict[0:10])
print(y_test[0:10])
运行结果:
[0 0 0 0 1 1 1 0 1 1] [0 0 0 0 1 1 1 0 1 2]
from sklearn.metrics import *
print('混淆矩阵列',confusion_matrix(y_test,predict))
print('准确率',accuracy_score(y_test,predict))
print(classification_report(y_test,predict))
运行结果:
混淆矩阵列 [[13 0 0] [ 0 13 0] [ 0 1 11]] 准确率 0.973684210526 precision recall f1-score support 0 1.00 1.00 1.00 13 1 0.93 1.00 0.96 13 2 1.00 0.92 0.96 12 avg / total 0.98 0.97 0.97 38
Hinge loss用于最大间隔(maximum-margin)分类,其中最有代表性的就是支持向量机SVM。
Hinge函数的标准形式:
其中,t为目标值(-1或+1),y是分类器输出的预测值,并不直接是类标签。其含义为,当t和y的符号相同时(表示y预测正确)并且|y|≥1时,hinge loss为0;当t和y的符号相反时,hinge loss随着y的增大线性增大。
losses=['hinge','squared_hinge']
for loss in losses:
cls=svm.LinearSVC(loss=loss)
cls.fit(X_train,y_train)
print('损失函数为%s' %loss)
print('个特征权重:%s,截距:%s' %(cls.coef_,cls.intercept_))
print("算法评分:%.2f" % cls.score(X_test,y_test))
print('\n\n\n')
运行结果:
损失函数为hinge 个特征权重:[[ 0.36635627 0.32164739 -1.07532841 -0.57004277] [ 0.47371332 -1.5596351 0.39464807 -1.34130072] [-1.21073321 -1.15219335 1.84567424 1.98849976]],截距:[ 0.1804968 1.34113194 -1.42835244] 算法评分:0.97 损失函数为squared_hinge 个特征权重:[[ 0.20959432 0.3992355 -0.81739149 -0.44231675] [-0.12888308 -0.78389372 0.52105507 -1.02458047] [-0.80308369 -0.87600462 1.21358279 1.81026741]],截距:[ 0.11973893 2.03764804 -1.44400323] 算法评分:0.97
#小结:在鸢尾花的问题上,虽然损失函数不同,但对测试集的预测准确率是一样的
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1ℓ1-norm和ℓ2ℓ2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数。
L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)
l12=['l1','l2']
for p in l12:
cls=svm.LinearSVC(penalty=p,dual=False)
cls.fit(X_train,y_train)
print('惩罚项为%s' %p)
print('个特征权重:%s,截距:%s' %(cls.coef_,cls.intercept_))
print("算法评分:%.2f" % cls.score(X_test,y_test))
print('\n\n\n')
运行结果:
惩罚项为l1 个特征权重:[[ 0.16181504 0.52432151 -0.93196326 0. ] [-0.15088218 -0.91022069 0.4799855 -0.93002568] [-0.56203425 -0.85258651 0.95828143 2.32145219]],截距:[ 0. 2.58284397 -2.60808209] 算法评分:0.95 惩罚项为l2 个特征权重:[[ 0.20966721 0.39922563 -0.81739423 -0.44237657] [-0.13079574 -0.7872181 0.52298032 -1.02445961] [-0.80308922 -0.87656106 1.21391169 1.81021937]],截距:[ 0.11945388 2.04805235 -1.44409296] 算法评分:0.97
#小结:这是dual=False是因为当dual=True时,penalty=12的情况不支持
cs=np.logspace(-2,1)
print(cs)
train_scores=[]
test_scores=[]
for c in cs :
cls=svm.LinearSVC(C=c)
cls.fit(X_train,y_train)
train_scores.append(cls.score(X_train,y_train))
test_scores.append(cls.score(X_test,y_test))
#绘图表示
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(cs,train_scores,label="Training score")
ax.plot(cs,test_scores,label="testing score")
ax.set_xlabel(r'c')
ax.set_ylabel(r'score')
ax.set_xscale('log')
ax.set_title("LinearSVC")
ax.legend(loc='best')
plt.show()
#小结:可以看到当c较小时,误分类点重要性较低,此时误分类点较多,分类器性能差
运行结果: