IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Hands-on data analysis Task05 -> 正文阅读

[人工智能]Hands-on data analysis Task05

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()
PassengerIdPclassAgeSibSpParchFareSex_femaleSex_maleEmbarked_CEmbarked_QEmbarked_S
00322.0107.250001001
11138.01071.283310100
22326.0007.925010001
33135.01053.100010001
44335.0008.050001001
train_data.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

思考二:数据之间差别

(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]) #取10个预测结果看下
print(model.predict_proba(X_train)[:10,1]) #取10个概率看下
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]) #取10个预测结果看下
print(model.predict_proba(X_train)[:10,1]) #取10个概率看下
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()    #画个图看看k的影响

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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点。
比较模型的好坏,完全包住,外侧模型更优;交叉曲线以下面积大的模型更优。参见西瓜书。


  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:28:52  更:2021-12-24 18:30:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 23:30:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码