# SKlearnDemo **Repository Path**: liuyz2973/SKlearnDemo ## Basic Information - **Project Name**: SKlearnDemo - **Description**: sklearn - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 机器学习课程 1.机器学习概述 1.1.机器学习开发流程 1.获取数据 2.数据处理 3.特征工程 4.机器学习算法训练 - 模型 5.模型评估 6.应用 1.2.学习框架和资料介绍 1.算法是核心,数据与计算是基础 2.找准定位 (1)分析很多的数据 (2)分析具体的业务 (3)应用常见的算法 (4)特征工程、调参数、优化 3.怎么做? (1)先入门操作 (2)实战类书籍 (3)机器学习-“西瓜书”-周志华、统计学习方法-李航、深度学习-“花书” 4.机器学习库与框架 Scikit-learn Tensorflow 2.特征工程 1.学习阶段数据集 (1)Kaggle网址:https://kaggle.com/datasets (2)UCI数据集网址:http://archive.ics.uci.edu/ml/ (3)Scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets 2.sklearn数据集 sklearn.datasets datasets.load_*()获取小规模数据集 datasets.fetch_*(data_home=None)获取大规模数据集 (1)Sklearn小数据集 ①sklearn.datasets.load_iris() (2)Sklearn大数据集 ①sklearn.datasets.fetch_20newsgroups(data_home=None) (3)数据集的返回值 ①datasets.base.Bunch(继承自字典) 1)Data:特征数据数组,是[n_samples*n_features]的二维numpy.ndarray数组 2)Tartget:标签数组,是n_samples的一维numpy.ndarray数组 3)DESCR:数据描述 4)Fearture_names:特征名,新闻数据,手写数字、回归数据集没有 5)Targe_names:标签名 ②dict[“key”] = values ③bunch.key = values (4)数据集的划分 ①训练数据:用于训练,构建模型 0.8 ②测试数据:在模型检验时使用,用于评估模型 0.2 (5)数据集划分api Sklearn.model_selection.train_test_splite(arrays,*options) X数据集的特征值 Y数据集的标签值 Test_size随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同 Return训练集特征值,测试集特征值,训练集目标值,测试集目标值 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split def datasets_demo(): """ sklearn 数据集使用 :return: """ # 获取数据集 iris = load_iris() print("鸢尾花数据集:\n",iris) print("查看数据集描述:\n",iris["DESCR"]) print("查看特征值的名字:\n",iris.feature_names) print("查看特征值:\n",iris.data,iris.data.shape) # 数据集划分 x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22) print("训练集的特征值:\n",x_train,x_train.shape) return None if __name__ == '__main__': datasets_demo() 3.特征工程介绍 (1)特征抽取/特征提取 机器学习算法-统计方法-数学公式 文本类型->数值 类型->数值 特征提取 Sklearn.feature_extraction ①字典特征提取 -类别->one-hot编码 Sklearn.feature_extraction.DictVectorizer(sparse=True,..) 1)DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器 返回值:返回sparse矩阵(稀疏矩阵),默认sparse=True,可以False,or使用toarray() 2)DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式 3)DictVectorizer.get_feature_names() 返回类别名称 Vector 数学:向量 物理:矢量 矩阵 matrix 二维数组 向量 vector 一维数组 父类:转换器类 返回sparse矩阵 将非零值 按照位置表示出来 节省内存 提高加载效率 应用场景: 1)pclass,sex 数据集当中类别特征比较多 a.将数据集的特征 -> 字典类型 b.DictVectorizer转换 2)本身拿到的数据就是字典类型 ②文本特征提取 单词 作为 特征 1)sklearn.feature_extraction.text.CountVectorizer(stop_words=[](停用词)) a.CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的课迭代对象 返回值:返回sparse矩阵,统计特征词出现次数,只能使用toarray() b.CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式 c.CountVectorizer.get_feature_names() 返回值:单词列表 2)sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,...) TF-IDF ->重要程度 分类机器学习算法进行文章分类中前期数据处理方式 Tfidf = tf * idf a.TF -词频 (term frequency,tf) b.IDF - 逆文本频率 (inverse document frequency,idf) 例如: 两个词语 “经济”,“非常” 语料库:1000篇文章 100篇:“非常” 10篇:“经济” 两篇文章 文章A(100词):10次“经济”TF-IDF:01.*2=0.2 Tf:10/100=0.1 Idf:log(1000/10) =2 文章B(100词):10次“非常”TF-IDF:0.1*1=0.1 Tf:10/100=0.1 Idf:log(1000/100) =1 ③中文文本特征提取 分词器:jieba 或者其他专业分词器 (2)特征预处理 数值型数据的无量纲化-为了特征同等重要 ①归一化(适用小批量数据,受异常点影响) 1)定义 通过对原始数据进行变换把数据映射到(默认为[0,1])之间 2)公式[mi,mx] X`=(x-min)/(max-min) X``=x`*(mx-mi)+mi 3)Api Sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...) a.MinMaxScalar.fit_transform(x) x:numpy array格式的数据[n_samples,n_features] b.返回值:转换后的形状相同的array ②标准化(适用大数据场景,不受异常点影响) 1)定义 通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内 2)公式 X`=(x-mean)/std mean:平均值,std:标准差-离散程度 3)Api Sklearn.preprocessing.StandardScaler() a.StandardScaler.fit_transform(x) X:numpy array格式的数据[n_samples,features] b.返回值:转换后的形状相同的array (3)特征绛维 针对二维数组[样本,特征]:降低的是列,特征个数 效果:特征与特征之间不相关 ①特征选择 1)Filter(过滤式):主要探究特征本身特点、特征与特征和目标值间关联 a.方差选择法:低方差特征过滤 Api sklearn.feature_selection.VarianceThredshold(threshold = 0.0) a)删除所有低方差特征 b)Variance.fit_transform(x) x:numpy array格式的数据[n_samples,n_features] 返回值:训练集差异低于threshold的特征将被删除。默认值是 保留所有非零方差特征,即删除所有样本中具有相同值的特征 b.相关系数-特征与特征之间的相关程度 皮尔逊相关系数(Pearsonr Correlation Coefficient)公式 取值范围-1<=r<=1 r>0,正相关;r=0,无相关;r<0,负相关 |r|<0.4,低度相关;0.4<=|r|<0.7,显著相关;0.7<|r|<=1,高度相关 Api from scipy.stats import pearsonr r=pearsonr(data1,data2) 返回值r第一个值是皮尔逊系数 2)Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联) a.决策树:信息熵、信息增益 b.正则化:L1、L2 c.深度学习:卷积等 ②主成分分析(PCA) 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量 作用:是数据维度压缩,尽可能降低元数据的维度(复杂度),损失少量信息。 应用:回归分析或者聚类分析当中 Api sklearn.decomposition.PCA(n_components=None) 将数据分解为较低维数空间 n_components: 小数:表示保留百分之多少的信息 整数:减少到多少特征 PCA.fit_transform(x)x:numpy array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array 3.分类算法 1.sklearn转换器和估计器 (1)转换器 ①转换器-特征工程的父类 ②实例化一个Transformer ③调用fit_transform(对于文档建立分类词频矩阵,不能同时调用) 标准化为例: (x-mean)/std fit_transform() fit() 计算 每一列的平均值、标准差 transform() (x-mean)/std进行最终的转换 (2)估计器 ①估计器-sklearn机器学习算法的父类 ②实例化一个estimator ③调用estimator.fit(x_train,y_train)计算->调用完毕,模型生成 ④模型评估: 1)直接比对真实值和预测值 y_predict = estimator.predict(x_test) y_test == y_predict 2)计算准确率 accuracy = estimator.score(x_test,y_test) 2.K-近邻算法 公式 (1)KNN核心思想:根据邻居来判断出你的类别 (2)KNN算法原理:k=1,容易受到异常点的影响 距离公式:曼哈顿距离(绝对值) 欧式距离(平方开平方) (3)Api from sklearn.neighbors import KNeighborsClassifier 3.模型选择与调优 Api: Sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None) (1)交叉验证(cross validation) (2)网格搜索(Grid Search) 4.朴素贝叶斯算法 公式 原理: 朴素:特征之间相互独立 贝叶斯:贝叶斯公式 应用场景: 文本分类,单词作为特征 Api from sklearn.naive_bayes import MultinomialNB 阿尔法默认值=1.0 防止贝叶斯公司分子为0,概率为0 总结: 优点:对确实数据不太敏感,算法比较简单,常用于文本分类 分类准确度高,速度快 缺点:由于使用了样本属性独立性的假设,所以如果特征属性有关联时,分类效果不好 5.决策树 公式 (1)认识:特征重要程度决定判断的先后顺序 (2)原理:信息熵、信息增益 信息论基础: ①信息(香农:消除不定性的东西) ②信息的衡量-信息量-信息熵(不确定性总和) ③信息增益 = 信息熵 - 条件熵 (该特征消除的不确定性,信息增益越大,特征权重越大) 决策树原理不止信息增益这一种: ID3: 信息增益 最大的准则 C4.5:信息增益比 最大的准则 CART: 分类器:基尼系数 最小准则 在sklearn中可以选择划分的默认原则 优势:划分更加细致(从后面例子的树显示来理解) (3)Api class sklearn.tree.DecisionTreeClassifier(ceriterion=’gini’,max_depth=None.random_state=None) ①决策树分类器 ②criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’ ③max_depth:树的深度大小 ④random_state:随机数种子 (4)决策树可视化 Api sklearn.tree.export_graphviz()该函数能够导出DOT格式 tree.export_graphviz(estimator,out_file=’tree.dot’,feature_names=[‘’,’’]) 树显示网站: http://webgraphviz.com/ (5)总结 ①优点:可视化-可解释能力强 ②确定:容易产生过拟合 6.集成学习方法之随机森林 随机 森林:包含多个决策树的分类器 原理:训练集:特征值 目标值 两个随机:训练集有放回随机 特征随机 Api Class sklearn.ensemble.RandomForestClassifier(n_sdtimators=10,criterion=’gini’,max_depth=None,bootstrap=True,random_state=None,min_samples_split=2) 随机森林分类器 N_estimators:integer,optional(default=10)森林里的树木数量 120,200,300,500,800,1200 Criteria:string,可选(dufault=’gini’)分割特征的测量方法 Max_depth:integer或None,可选(默认=无)树的最大深度5,8,15,30 Max_features=’auto’,每个决策树的最大特征数量 n_features Auto=n^2,sqrt=n^2,log2=log2(n),None=n Bootstrap:boolean,optional(default=True)是否在构建树时使用放回抽样 Min_samples_split:节点划分最少样本数 Min_samples_leaf:叶子节点的最小样本数 超参数:n_estimator,max_depth,min_samples_spit,min_samples_leaf 4.回归与聚类算法 1.线性回归 (1)原理: 函数关系 特征值和目标值 线性模型 线性关系: Y=w1*x1+w2*x2+...+wn*xn =WTX +b 线性模型: 自变量一次 参数一次,自变量可以为多次 线性关系&线性模型: 线性关系一定是线性模型;线性模型不一定是线性关系 (2)损失函数和优化原理 ①损失函数/目标函数 - 最小二乘法 公式 ②优化损失 1)正规方程 - 解析解 公式 2)梯度下降法 公式 (3)Api ①Sklearn.linear_model.LinearRegression(fit_intercept=True) 1)通过正规方程化 2)Fit_intercept:是否计算偏置 3)LinearRegression.coef_:回归系数 4)LinearRegression.intercept_:偏置 ②Sklearn.linear_model.SGDRegressor(loss=”squared_loss”,fit_intercept=True,learning_rate=’invsaling’,eta0=0.01) 1)SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型 2)Loss:损失类型 a.Loss=”squared_loss”:最小二乘法 3)Fit_intercept:是否计算偏置 4)Learning_rate:string,optional a.学习率填充 b.‘constant’:eta=eta0 c.‘optimal’:eta=1.0/(alpha*(t+t0))[default] d.‘invscaling’:eta = eta0/pow(t,power_t) a)Power_t = 0.25:存在父类 e.对于一个常数值的学习率来说,可以使用learning_rate=’constant’,并使用eta0来指定学习率 5)SGDRegressor.coef_:回归系数 6)SGDRegressor.intercept_:偏置 (4)回归性能评估 ①均方误差 - 最小二乘法求平均 ②Api: 1)Sklearn.metrics.mean_squared_error(y_true,y_pred) a.均方误差回归损失 b.Y_true:真实值 c.Y_pred:预测值 d.Return:浮点数结果 2.欠拟合与过拟合 (1)欠拟合 - 原始特征太少 解决方法:增加数据的特征数量 (2)过拟合 - 原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾所有特征 解决方法:正则化 L1:损失函数 + λ惩罚项|W| L2: 损失函数 + λ惩罚项 W^2 (常用岭回归) 3.线性回归的改进-岭回归 (1)Api Sklearn.linear_model.Ridge(alpha=1.0,fit_intercept=True,solver=”auto”,normalize=False) ①具有L2正则化的线性回归 ②Alpha:正则化力度,也叫λ 1)Λ取值:0~1 1~10 2)Solver:会根据数据自动选择优化方法 Sag:如果数据集、特征都比较大,选择该随机梯度下降优化 3)Normalize:数据是否进行标准化 Normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据 4)Ridge.coef_:回归权重 5)Ridge.intercept_:回归偏置 Api2 Ridge方法相当于SGDRegressor(penalty=’l2’,loss=”squared_loss”),只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现SAG) ③Sklearn.linear_model.RidgeCV(_BaseRidgeCV,RegressorMixin) 1)具有l2正则化的线性回归,可以进行交叉验证 2)Coef_:回归系数 正则化力度越大,权重系数会越小 正则化力度越小,权重系数会越大 4.逻辑回归与二分类 (1)应用场景 ①广告点击率 - 是否会被点击 ②是否为垃圾邮件 ③是否患病 ④金融诈骗 - 是否为金融诈骗 ⑤虚假账号 - 是否为虚假账号 正例 / 反例 (2)原理 ①线性回归的输出,就是逻辑回归的输入 ②激活函数 - Sigmoid函数 1/(1+e^(-x)) [0,1],默认为0.5为阈值 ③假设函数/线性模型 1/(1+e^(-(w1*x1+...+wn*xn+b))) ④损失函数 - 对数似然损失分段函数 - 综合完整损失函数 ⑤优化 - 梯度下降法 (3)Api Sklearn.linear_model.LogisticRegression(solver=’liblinear’,penalty=’l2’,C=1.0) ①Solver:优化求解方式(默认开元的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数) Sag:根据数据集自动选择,随机平均梯度下降 ②Penalty:正则化的种类 ③C:正则化力度 默认将类别数量少的当做正例 Api2 LogisticRegression方法相当于SGDClassifier(loss=”log”,penalty=””),SGDClassifier实现了一个普通的随机梯度下降学习,也支持平均随机梯度下降法(ASGD),可以通过设置average=True.而使用LogisticRegression(实现了SAG) 5.逻辑回归评估的方法 (1)精确率与召回率 (Precision Recall) ①混淆矩阵 1)TP = True Possitive 真正例 2)FN = False Negative 伪反例 ②精确率 ③召回率 查的全不全 工厂 质量检测 次品 召回率 ④F1-score 模型稳健性 F1 = 2TP/(2TP+FN+FP)=(2*P.R)/(P+R) ⑤Api Sklearn.metrics.classification_report(y_true,y_pred,labels=[],target_names=None) Y_true:真实值 Y_pred:估计器预测目标值 Labels:指定类别对应的数字 Target_names:目标类别名称 Return:每个类别精确率与召回率 (2)ROC曲线与AUC指标 ①TPR与FPR 1)TPR = TP / (TP +FN) - 召回率 所有真实类别为1的样本中,预测类别为1的比例 2)FPR = FP / (FP + TN) 所有真实类别为0的样本中,预测类比为1的比例 ②AUC指标 1)AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率 2)AUC的最小值为0.5,最大值为1,取值越大越好 3)AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器 4)0.5