import numpy as np
import pandas as pd
import matplotlib as plt
import seaborn as sns
from IPython.display import Image
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.figsize'] = (10, 6)
思考一:数据库及其作用
matplotlib是python第三方作图库; seaborn是python可视化库,基于matplotlib,有很多成型的模板可以直接调用; IPython.display是在Jupyter上显示可视化的图片; %matplotlib inline作用是当你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候, 或者生成一个figure画布的时候,可以直接在你的python console里面生成图像。
data = pd.read_csv(r"D:\Data.Analysis\clear_data.csv")
train_data = pd.read_csv(r"D:\Data.Analysis\train.csv")
data.head()
| PassengerId | Pclass | Age | SibSp | Parch | Fare | Sex_female | Sex_male | Embarked_C | Embarked_Q | Embarked_S |
---|
0 | 0 | 3 | 22.0 | 1 | 0 | 7.2500 | 0 | 1 | 0 | 0 | 1 |
---|
1 | 1 | 1 | 38.0 | 1 | 0 | 71.2833 | 1 | 0 | 1 | 0 | 0 |
---|
2 | 2 | 3 | 26.0 | 0 | 0 | 7.9250 | 1 | 0 | 0 | 0 | 1 |
---|
3 | 3 | 1 | 35.0 | 1 | 0 | 53.1000 | 1 | 0 | 0 | 0 | 1 |
---|
4 | 4 | 3 | 35.0 | 0 | 0 | 8.0500 | 0 | 1 | 0 | 0 | 1 |
---|
train_data.head()
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
---|
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
---|
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
---|
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
---|
思考二:数据之间差别
(1)数据标签显著不同,clear_data中没有存活标签;(2)clear_data对性别(Sex)和登船点(Embarked)进行了One-hot编码;(3)clear_data变量的值均为数值型的,train则不然;(4)clear_data少了一些特征,如Name和Cabin,其中Name对训练影响不大,cabin缺失值过多;(5)clear_data的PassengerID和train的不对应,错开一位。
思考三:数据集的哪些特点会导致模型在拟合数据时发生变化
根据sklearn.png,总结:(1)数据集大小,即样本数量;(2)数据集是否有标签;(3)数据集中数据的类型,如表格型数据、图片、文本等;(4)数据集的数据特征,特征数量、重要性、缺失程度、稀疏性等。
from sklearn.model_selection import train_test_split
train_test_split
<function sklearn.model_selection._split.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)>
X = data
y = train_data["Survived"]
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,stratify=y,random_state=1)
X_train.shape,X_test.shape,y_train.shape,y_test.shape
((712, 11), (179, 11), (712,), (179,))
思考四:划分数据集的方法有哪些?
以下来自西瓜书的学习笔记: 数据集D 将数据集D划分为训练集S和测试集T 测试集T和训练集S互斥,且符合i.i.d.假设 1.留出法(hold-out) 将数据集D划分为训练集S和测试集T两个互斥的集合。 问题一:划分时,保证S和T分布的一致性。 问题二:给定D和划分比例,所以一般进行多次划分、多次实验,求平均值。 问题三:因为S和T都是D的一部分,S多,训练稳定,评估不稳定;T多,训练不稳定,评估稳定。(一般划分比例为2/3~4/5) 2.交叉验证法(cross validation) 将数据集D划分为大小相似的k个互斥子集,每次用k-1个作为训练集,余下的那个子集作为测试集。在k次实验后,求取平均值,此法又称:“k折交叉验证(k-fold cross validation)”。(其实是一种集成学习方式,只不过最后选择一个学习器使用,而集成学习将产生的分类器都利用起来。) 问题一:存在多种划分方式,一般重复p次,取均值。 问题二:如果k和样本数相同,称为留一法(Leave-One-Out, LOO),尽管不受随机划分方式影响,训练出的模型与用数据集D训练出的结果相似,但在数据集很大时,计算开销很大。 3.自助法(boostraping) 在数据集D(有m个样本)采用有放回抽样的方式抽取m个样本作为训练集,每次采集约有36.8%的样本不会进入训练集中,这部分样本作为测试集,测试结果亦称“包外估计(out-of-bag estimate)”。 优点一:数据集较小、难以有效划分训练集和测试集时候很有用。 优点二:能从初始数据中产生多个不同的训练集,能有效支持集成学习算法。 问题:本方法产生的数据集改变了初始数据集D的分布,会引入估计偏差。当样本量足够时,一般采用前两种方法。
思考五:为什么使用分层抽样,即stratify=y?
保证训练集和验证集数据分布一致,即生还人员比例大致相同。
思考六:什么情况下切割数据集的时候不用进行随机选取?
不太明白意思。 如果所有样本(样本规模合适)都进行无监督学习就不用抽样了。 时间序列有关的数据不能随机抽样,因为影响样本点的数据受t时间周围数据影响大。 如果是说数据本身的随机性,一般情况我们是不知道数据本身的分布情况的。 留1不用抽,每个数据都会轮到。
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
model.fit(X_train,y_train)
print(model.predict(X_train)[:10])
print(model.predict_proba(X_train)[:10,1])
print("训练准确率:",model.score(X_train,y_train))
print("测试准确率:",model.score(X_test,y_test))
[1 0 1 0 1 1 1 1 0 0]
[0.54025785 0.44195125 0.619254 0.10522067 0.9621128 0.56317439
0.82105498 0.92076371 0.07318303 0.39060517]
训练准确率: 0.797752808988764
测试准确率: 0.8044692737430168
d:\anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(oob_score=True,random_state=10)
model.fit(X_train,y_train)
print(model.predict(X_train)[:10])
print(model.predict_proba(X_train)[:10,1])
print(model.oob_score_)
print(model.feature_importances_)
print("训练准确率:",model.score(X_train,y_train))
print("测试准确率:",model.score(X_test, y_test))
[1 0 0 0 0 1 1 1 0 0]
[0.99 0.04 0.15 0.01 0.31 0.99 0.96 0.98 0.03 0.25]
0.8089887640449438
[0.18500286 0.08239655 0.16720959 0.04584498 0.03036023 0.19193926
0.12690882 0.13735018 0.01320978 0.00779116 0.01198658]
训练准确率: 1.0
测试准确率: 0.8435754189944135
model = RandomForestClassifier(n_estimators=200,max_depth=5,oob_score=True,random_state=10)
model.fit(X_train,y_train)
print(model.oob_score_)
print(model.feature_importances_)
print("训练准确率:",model.score(X_train,y_train))
print("测试准确率:",model.score(X_test, y_test))
0.8089887640449438
[0.06133551 0.12705973 0.09321182 0.04529824 0.028526 0.12471316
0.22969958 0.25907874 0.01374012 0.00557229 0.01176481]
训练准确率: 0.8539325842696629
测试准确率: 0.8435754189944135
思考七:线性模型为什么可以做分类任务?背后的数学关系是什么?
主要是因为能够得到近似的概率预测。
思考八:对于多分类问题,线性模型是怎么进行分类的?
多个二分类器,比较概率大小。
以下来自西瓜书的学习笔记: 部分二分类方法可以推广到多分类,但在更多情况下,我们会用二分类学习器解决多分类问题。基本思路:将N个类别拆解成若干了二分类任务求解,每个二分类任务训练一个分类器。在测试时,对这些二分类的预测结果进行集成,获得多分类结果。难点在于如何对多分类任务进行拆分。 策略一:“一对一”,两两配对,产生N(N-1)/2个分类器。新样本数据提交给所有分类器,结果投票产生。 策略二:“一对其余”,产生N个分类器。新样本数据提交给所有分类,若只有一个正类,则对应的类别标记作为最终结果,如不止一个正类,则通常考虑分类器的预测置信度,选择置信度最大的类别标记作为分类结果。 策略三:“多对多”。正反类的构造必须有特殊的设计,如“纠错输出码”(Error Correcting Output Codes)。先“编码”再“解码”。
思考九:预测概率的标签对我们有什么帮助?
不仅能够进行分类,知道概率大小还可以帮助我们判断可信度,概率越大可信度越高。 根据贝叶斯派的理论,概率不是一定固定参数,而是符合一定概率分布,预测出的概率值是分布的期望,相应的可以给出置信度,相比仅仅给出一个概率数值可以提供更多的信息。
思考十:模型评估
以下来自西瓜书的学习笔记: (离散变量)一般使用均方误差 (连续变量)均方误差一般表达形式(数据分布D和概率密度函数p) 1.错误率和精度 错误率:分类错误的样本数占样本总数的比例。 精度:分类正确的样本数占样本总数的比例。 2.查准率、查全率和F1-score 查准率(precision):预测为真的样本中有多少在数据集的标签也为真。 查全率(recall):数据集标签为真的样本有多少在预测结果中也为真。 P和R是一对矛盾的度量。 P-R曲线:查全率为横轴、查准率为纵轴 平衡点(Break-Even Point, BEP)比较不用P-R曲线的优劣,即查全率=查准率时的取值。 F1-score:P和R的调和平均数,相比于算数平均和几何平均,调和平均更重视较小值。 在实际应用中,对查准率和查全率的重视程度不同。 Fβ则为P和R的加权调和平均数。β>0度量查全率相对查准率的重要性。 F_β=((1+β^2 )×P×R)/((β^2×P)+R) 当β=1时,即F1-score。 当β>1时,查全率有更大影响。 当β<1时,查准率有更大影响。 在实际实验中,一般有多个二分类混淆矩阵,如在多个数据集上训练/测试、进行多次训练/测试等,有: (先算再平均)macro-P、macro-R、macro-F1 (先平均再算)micro-P、micro-R、micro-F1 3.ROC和AUC 真正例率(True Positive Rate, TPR):即查全率,数据集标签为真的样本有多少在预测结果中也为真。 假正例率(False Positive Rate, FPR):数据集标签为假的样本有多少在预测结果为真。 ROC(Receiver Operating Characteristic)曲线:横轴为FPR,纵轴为TPR。 AUC:Area Under ROC Curve。
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
import warnings
warnings.filterwarnings("ignore")
model=LogisticRegression()
scores = cross_val_score(model,X_train,y_train,cv=10)
scores
array([0.75 , 0.84722222, 0.77464789, 0.8028169 , 0.76056338,
0.8028169 , 0.74647887, 0.84507042, 0.78873239, 0.73239437])
scores.mean()
0.7850743348982785
思考十一:k折越多的情况下会带来什么样的影响?
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
k_range = range(2,30)
cv_scores = []
for i in k_range:
model = LogisticRegression()
scores = cross_val_score(model,X_train,y_train,scoring="accuracy",cv=i)
cv_scores.append(scores.mean())
plt.plot(k_range,cv_scores)
plt.xlabel("K")
plt.ylabel("Accuracy")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqbzQr0v-1640269239076)(output_35_0.png)]
思考十二:什么是二分类问题的混淆矩阵,理解这个概念,知道它主要是运用到什么任务中的?
TP/TN/FP/FN;主要运用在分类任务上。
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
model.fit(X_train,y_train)
y_pred = model.predict(X_train)
confusion_matrix(y_train,y_pred)
array([[381, 58],
[ 86, 187]], dtype=int64)
print(classification_report(y_train,y_pred))
precision recall f1-score support
0 0.82 0.87 0.84 439
1 0.76 0.68 0.72 273
accuracy 0.80 712
macro avg 0.79 0.78 0.78 712
weighted avg 0.80 0.80 0.80 712
思考十三:如果自己实现混淆矩阵的时候该注意什么问题?
计算顺序: (先算再平均)macro-P、macro-R、macro-F1 (先平均再算)micro-P、micro-R、micro-F1
思考十四:什么是ROC曲线,ROC曲线为了解决什么问题?
Receiver Operating Charactristic,受试者工作特征。 用于比较模型的泛化性能的好坏。
思考十五:多分类问题如何绘制ROC曲线?
方法一:作n条ROC曲线求平均; 方法二:任何一个样本均有一个二分类结果且有一个对应概率,即可看做二分类问题直接画出ROC图。
思考十六:从这条ROC曲线中得到什么信息?
equal error点。 比较模型的好坏,完全包住,外侧模型更优;交叉曲线以下面积大的模型更优。参见西瓜书。
|