回归和分类(regression vs classification)
回归和分类都是监督学习的方法。
分类(classification)问题是训练一个模型,用于预测定性(qualitative)的目标。

回归(Regression)问题是训练一个模型,用于预测定量(quantitative)目标!
两者都是建立一个描述输入(特征)与输出(标签)关系的模型,回归算法返回的是一个连续的值(value),分类算法返回的是一个离散的状态(state)。
如何使用scikit learn库划分训练集和测试集(Splitting a dataset into training and testing data)这里我们使用pandas(这是一个专门用于数据挖掘的库)的pd.read_csv读入数据。
使用numpy的np.array得到输入数据和标签数据。
使用sklearn.cross_validation的train_test_split将数据划分为训练集和测试集。
# Reading the csv file
import pandas as pd
data = pd.read_csv("data.csv")
# Splitting the data into X and y
import numpy as np
X = np.array(data[['x1', 'x2']])
y = np.array(data['y'])
# Import statement for train_test_split
from sklearn.cross_validation import train_test_split
# split the data into training and testing sets.The size of the testing set should be 20% of the total size of the data.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
如何使用scikit learn库训练模型(Training Models in scikit learn)
这里以“逻辑回归”、“决策树”、“支持向量机”为例,从sklearn.linear_model导入LogisticRegression、GradientBoostingClassifier、SVC,上述三个函数用于生成模型的实例,实例调用fit属性用于训练模型。
import pandas
import numpy
# Read the data
data = pandas.read_csv('data.csv')
# Split the data into X and y
X = numpy.array(data[['x1', 'x2']])
y = numpy.array(data['y'])
# import statements for the classification algorithms
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC
# Logistic Regression Classifier
classifier = LogisticRegression()
classifier.fit(X,y)
# Decision Tree Classifier
classifier = GradientBoostingClassifier()
classifier.fit(X,y)
# Support Vector Machine Classifier
classifier = SVC()
classifier.fit(X,y)
混淆矩阵(Confusion Matrix)
混淆矩阵把预测结果与真实结果放在一张表格中进行比较。下图是当二元逻辑回归的混淆矩阵。
为什么叫做混淆矩阵?因为弄明白表格中的每个格代表什么意思容易让人混淆。以上图为例:True Positive代表正确预测了正例。True Negtive代表正确预测了负例。False Positive代表错误预测了正例。False Negtitive代表错误预测了负例。
混淆矩阵也可以扩展到多元的情况。
准确率(Accuracy)
有了混淆矩阵的概念,我们可以定义什么是准确率。
查准率(Precision)
查全率(Recall)
F1 Score
F1得分可以理解为对查准率和查全率取平均,但是这里不是取算数平均,而是取调和平均。为什么?
因为调和平均值更接近较小值,这样查准率或查全率中哪个值较小,调和平均值就更接近这个值,这样的测量指标更严格!
(Harmonic mean is better than arithmetic mean cause it's closer to the lower one.)
F-beta Score
F-beta得分是F1得分的更通用模式,也就是说F1得分是F-beta得分的特例。
我们可以根据需要任意调整的取值,当是,该公式就是F1 Score。
F-beta score的取值边界(Boundaries in the F-beta score):
如果我们取β=0:
我们将得到查准率,所以β的最小值是0。
如果我们取β是无穷大:
我们将得到查全率。
因此β的边界是0到无穷大。
If β=0, then we get precision.
If β=∞, then we get recall.
For other values of β, if they are close to 0, we get something close to precision, if they are large numbers, then we get something close to recall, and if β=1, then we get the harmonic mean of precision and recall.
ROC Curve
除了上述方法来判断模型的优劣,还要一种方法是ROC Curve,就是将真正例比例和假正例比例作为x,y坐标轴,画出来一条曲线,这条曲线就叫做ROC Curve。
如何判断模型好坏?答案是利用AUC,就是我们画出的曲线下面的面积(AUC),面积越大,模型越好。
回归测量指标(Regression Metrics)
上面我们讨论了准确率、查准率、查全率、ROC Curve等,这些都是分类问题的测量指标,下面我们讨论一下回归问题的测量指标。
绝对平均误差(Mean Absolute Error)
就是求预测值与真实值之间的差值,由于该公式无法求微分,因此不利于我们使用梯度下降等优化方法。因此一般,我们使用平方误差作为测量标准。
均方误差(Mean Squared Error)
R2 Score
简单来说R2得分就是用“模型的均方误差”与“线性回归模型的均方误差”比较。1减去这个比值就是R2得分。
错误类型(Type of errors)
过拟合overfitting模型在训练集表现很好,但是在测试集表现很差。Model does good in training set, not good in testing set.
这种错误由于方差太大引起。error due to variance
欠拟合underfitting模型在训练集表现很差。Model perform bad in training set.
这种错误是由于偏差太大。error due to bias
交叉验证(Cross Validation)
就是使用训练集的一部分用于验证模型。
K-fold Cross Validation
K-fold交叉验证就是把训练集分成k份,对每一份进行训练,并得到测量标准。将k份求平均作为模型的测量标准。
学习曲线(Learning Curves)
用于测试模型是否过拟合或欠拟合的方法。
Another way to find out which model is better.
如果我们将不同模型的错误值画出来,得到以下图形。
以下是测试代码,感兴趣可以自行运行测试。需要注意的是我们的代码中使用的是得分而非错误率。
Very important: As you can see, we defined our curves with Training and Testing Error, and this function defines them with Training and Testing Score. These are opposite, so the higher the error, the lower the score. Thus, when you see the curve, you need to flip it upside down in your mind, in order to compare it with the curves above.
# Import, read, and split data
import pandas as pd
data = pd.read_csv('data.csv')
import numpy as np
X = np.array(data[['x1', 'x2']])
y = np.array(data['y'])
# Fix random seed
np.random.seed(55)
### Imports
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC
# TODO: Uncomment one of the three classifiers, and hit "Test Run"
# to see the learning curve. Use these to answer the quiz below.
### Logistic Regression
#estimator = LogisticRegression()
### Decision Tree
#estimator = GradientBoostingClassifier()
### Support Vector Machine
#estimator = SVC(kernel='rbf', gamma=1000)
from sklearn.model_selection import learning_curve
# It is good to randomize the data before drawing Learning Curves
def randomize(X, Y):
permutation = np.random.permutation(Y.shape[0])
X2 = X[permutation,:]
Y2 = Y[permutation]
return X2, Y2
X2, y2 = randomize(X, y)
def draw_learning_curves(X, y, estimator, num_trainings):
train_sizes, train_scores, test_scores = learning_curve(
estimator, X2, y2, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
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.title("Learning Curves")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.plot(train_scores_mean, 'o-', color="g",
label="Training score")
plt.plot(test_scores_mean, 'o-', color="y",
label="Cross-validation score")
plt.legend(loc="best")
plt.show()
网格搜索(Grid Search)
网格搜索是采用表格将不同模型、不同参数的错误率放在一张表格中,然后选择表现最好的模型作为我们的选择。
参考资料
资料地址Supervised learning documentation
附图:如何选择正确而的分类器(Choosing the right estimator)