机器学习理论基础
算法模型性能评估的指标和评估方法
1.过拟合和欠拟合
过拟合:很好地拟合训练样本,但对新数据预测准确定不好(高方差);
欠拟合:对训练样本和新数据都不能很好地拟合(高偏差)
2.成本函数
成本:衡量模型和训练样本符合程度的指标,拟合出来的值和真实值之间的误差平均值。
成本函数J(θ):成本和模型参数的函数关系。
针对一个数据集,可有多个模型来拟合数据;针对某个模型,又需从无穷多个参数中找出一个最优参数,使得J(θ)最小。
3.模型准确性
计算测试数据集的成本
scitik使用score来表达模型的性能,其与成本成反比。
把数据分为三份:训练数据集,交叉验证数据集和测试数据集,推荐比例6:2:2。
使用训练集和交叉验证集测试数据,求出每个模型的最好参数;测试数据集,选出最好的模型。
4.学习曲线
学习曲线:把Jtrain(θ)和Jcv(θ)作为纵坐标,画出与训练数据集m的大小关系。
作用:观察模型的准确定与训练集大小的关系。
画学习曲线的步骤
1)把数据集分成训练数据集和交叉验证数据集
2)把训练集的20%作为训练样本,训练出模型参数
3)使用交叉验证数据集来计算训练出来模型的准确性
4)以训练数据集的准确性,交叉验证的准确性作为纵坐标,训练数据集个数作为横坐标,在坐标轴上画出上述步骤计算出来的模型准确性。
5)训练样本集增加10%,调到第3步,直到训练数据集大小为100%为止
(1)实例:画出学习曲线
1)构建多项式模型
def polynomial_model(degree=1):
polynomial_features=PolynomialFeatures(degree=degree,include_bias=False)
linear_regression=LinearRegression()
pipeline=Pipeline([('polynomial_features',polynomial_features),
('linear_regresiion',linear_regression)])
return pipeline
from sklearn.model_selection import learning_curve,ShuffleSplit
def plot_learning_curve(estimator,title,X,y,ylim=None,cv=None,n_jobs=1,train_sizes=np.linspace(.1,1.0,5)):
plt.title(title)
if ylim is not None:
plt.ylim(*ylim)
plt.xlabel('Training examples')
plt.ylabel('Score')
train_sizes,train_scores,test_scores=learning_curve(estimator,X,y,cv=cv,n_jobs=n_jobs,train_sizes=train_sizes)
train_scores_mean=np.mean(train_scores,axis=1)
train_scores_std=np.std(train_scores,axis=1)
test_scores_mean=np.mean(test_scores,axis=1)
test_scores_std=np.std(test_scores,axis=1)
plt.grid()
plt.fill_between(train_sizes,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.1,color='r')
plt.fill_between(train_sizes,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.1,color='g')
plt.plot(train_sizes,train_scores_mean,'o-',color='r',label='Training score')
plt.plot(train_sizes,test_scores_mean,'o-',color='g',label='Cross-validation score')
plt.legend(loc='best')
return plt
2)画学习曲线
cv=ShuffleSplit(n_splits=10,test_size=0.2,random_state=0)
titles=['Learning Curves (Under Fitting)','Learning Curves','Learning Curves (Over Fitting)']
degrees=[1,3,10]
plt.figure(figsize=(19,4),dpi=200)
for i in range(len(degrees)):
plt.subplot(1,3,i+1)
plot_learning_curve(polynomial_model(degrees[i]),titles[i],X,y,ylim=(0.75,1.01),cv=cv)
plt.show()
欠拟合,仅增加训练样本,对算法准确性提高较小。
(2)过拟合和欠拟合的特征
过拟合:成本Jtrain(θ)较低,成本Jcv(θ)较高
欠拟合:成本Jtrain(θ)和Jcv(θ)都较高。
5.算法模型性能优化
先判断算法模型是欠拟合还是过拟合。
(1)过拟合
1).获取更多的训练数据;
2).减少输入的特征数量
(2)欠拟合
1).增加有价值的特征
2).增加多项式特征
6.查准率和召回率
处理先验概率低的问题,总是把概率较低的事件定义为1,把y=1作为Positive的预测结果。
查准率=TruePosition/(TruePositon+FalsePosition) sklearn.metrics.prtcision_score()
召回率=TruePosition/(TruePosition+FalseNegative) sklearn.metrics.recall_score()
7.F1 Score
F1Score=2*P*R/(P+R) sklearn.metrics.f1_score()
参考文献:《scikit-learn机器学习》