我们采用sklearn这个库来进行建模和评估
1.分割训练集和测试集
先来简单介绍一下数据分割的函数:train_test_split,资料来源于sklearn的官方文档
X_train,X_test,y_train,y_test=
sklearn.model_selection.train_test_split(train_data,train_target, test_size=None,train_size=None, random_state=None, shuffle=True, stratify=None)
参数:
train_data:待划分的样本特征集合
train_target:待划分的样本标签
**test_size:**输入在0-1间表示测试集的样本比例,输入整数表示测试集样本数目
train_size:输入0-1间表示要包含在训练拆分中的数据集的比例,整数表示样本的数目
**random_state:**随机种子,即划分标记
**shuffle:**是否打乱数据顺序再划分,默认True
**stratify:**表示按指定列进行分层采样
返回值:
**X_train:**划分出的训练集数据
**X_test:**划分出的测试集数据
**y_train:**划分出的训练集标签
**y_test:**划分出的测试集标签
from sklearn.model_selection import train_test_split
data=pd.read_csv(r'C:\Users\45168\Desktop\hands-on-data-analysis-master\第三章项目集合\clear_data.csv')
train=pd.read_csv(r'C:\Users\45168\Desktop\hands-on-data-analysis-master\第三章项目集合\train.csv')
X=data
y=train['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
2.模型建立
具体各个模型的参数及使用方法不详细介绍,这里只是作为数据分析的步骤进行演示。
逻辑斯蒂回归
默认参数使用逻辑斯蒂回归:
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
lr = LogisticRegression()
lr.fit(X_train, y_train)
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr.score(X_test, y_test)))
带参数:
lr2 = LogisticRegression(C=100)
lr2.fit(X_train, y_train)
print("Training set score: {:.2f}".format(lr2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr2.score(X_test, y_test)))
随机森林分类:
默认参数:
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))
带参数:
rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)
rfc2.fit(X_train, y_train)
print("Training set score: {:.2f}".format(rfc2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc2.score(X_test, y_test)))
3.预测结果
pred = lr.predict(X_train)
pred
可以看到pred是一个数组,且里面的元素都是0,1构成的
接下来我们查看预测标签的概率:
pred_proba = lr.predict_proba(X_train)
pred_proba
4.模型评估
建模之后,我们往往需要对模型进行评估。模型评估的目的是了解模型的泛化性能,简单来说就是模型的解释性是否满足要求。
模型评估常用的一种技术叫做K折交叉验证,K是用户指定的数字,通常取5或者10。交叉验证的意思就是把原始数据集分成训练集和测试集,我们利用训练集进行模型训练,利用测试集来评估模型的性能。
下面介绍几个术语:
- 准确率(precision):度量的是被预测为正例的样本中有多少是真正的正例
- 召回率(recall):度量的是正类样本中有多少被预测为正类
- f-分数是准确率与召回率的调和平均
4.1 交叉验证
from sklearn.model_selection import cross_val_score
lr = LogisticRegression(C=100)
scores = cross_val_score(lr, X_train, y_train, cv=10)
scores
注意:K值的选取不是越大越好,具体情况要具体分析,在2017年的一项研究中给出了如下经验公式:
K=ln(n),且n/K>3d,n是数据量,d是特征数。
这里是论文:Jung, Y., 2017. Multiple predicting K-fold cross-validation for model selection. Journal of Nonparametric Statistics, pp.1-19.
4.2 混淆矩阵
这里简单介绍一下二分类问题的混淆矩阵
二分类矩阵如下构成:
TP = True Postive = 真阳性
FP = False Positive = 假阳性
FN = False Negative = 假阴性
TN = True Negative = 真阴性
比如:
真实值:0 1 0 0 1 1
预测值:0 1 1 1 0 1
则TP=2,FN=1,FP=2,TN=1
● 精度(precision)= TP/(TP+FP)
● 召回(recall,敏感度,真阳率)= TP/(TP+FN)
● 准确率(Accuracy)= (TP+TN)/(TP+FN+FP+TN)
● F1 = 2*TP / (2*TP+FP+FN)
from sklearn.metrics import confusion_matrix
lr = LogisticRegression(C=100)
lr.fit(X_train, y_train)
pred = lr.predict(X_train)
confusion_matrix(y_train, pred)
from sklearn.metrics import classification_report
print(classification_report(y_train, pred))
4.3 ROC曲线
具体的介绍可以参考这一篇文章,讲的很通俗易懂
https://zhuanlan.zhihu.com/p/26293316
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_test, lr.decision_function(X_test))
plt.plot(fpr, tpr, label="ROC Curve")
plt.xlabel("FPR")
plt.ylabel("TPR (recall)")
close_zero = np.argmin(np.abs(thresholds))
plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10, label="threshold zero", fillstyle="none", c='k', mew=2)
plt.legend(loc=4)
ROC曲线一个重要的性质就是:曲线下方与坐标轴所谓面积越大越好。
|