《python机器学习基础教程》读书笔记1

1.一个简单的sklearn示例

import pandas as pd
import numpy as np
from lightgbm import LGBMClassifier
from sklearn.model_selection import KFold,StratifiedKFold,cross_val_score
from sklearn.model_selection import train_test_split

下面以lightGMB为例,略去特征工程部分

#训练集拷贝和分类
train1 = train.copy()
train2 = train.copy()

y_train1 = train1['LOST']
train1 = train1.drop('LOST',axis=1)
X1_train,X1_test,y1_train,y1_test = train_test_split(train1,y_train1,stratify = y_train1,random_state=0)

y_train2 = train2['LOST']
train2 = train2.drop('LOST',axis=1)
#简单训练集分类验证
#训练LGB
lgb1 = LGBMClassifier(n_estimators=400,learning_rate=0.05)
lgb1.fit(X1_train,y1_train)
print("Training set score: {:.3f}".format(lgb1.score(X1_train,y1_train)))
print("Test set score: {:.3f}".format(lgb1.score(X1_test,y1_test)))
#交叉验证
#训练LGB
kfold = KFold(n_splits=5,shuffle=True,random_state=42)
lgb2 =  LGBMClassifier(n_estimators=400,learning_rate=0.05)
scores = cross_val_score(lgb2,train2,y_train2,cv=kfold)
print("Cross-validation scores:{}".format(scores))
print("Average Cross-validation scores:{}".format(scores.mean()))
#预测
y_predict = lgb.predict(test)

2.L1还是L2

  • 假定只有几个特征是真正需要的,那么应该使用L1正则化,否则使用L2
  • 如果模型的可解释性很重要的话,使用L1

3.supervised

k-neighbors

from sklearn.neighbors import KNeighborsClassifier
  • KNN分类器有两个重要参数,邻居个数和数据点之间距离的度量方法

linear-model

from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDClassifier
from sklearn.linear_model import SGDRegressor
  • 线性模型的主要参数是正则化参数,再回归模型中叫alpha,在LR和linearSVM中是C
  • 要加快训练速度,可以在LR和Ridge中选择solver=‘sag’,也可以选择SGD类的模型

naive-bayes

from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import MultinomialNB
  • GaussianNB可用于任意连续数据
  • BernolliNB假定输入数据为二分类数据
  • MutinomialNB假定输入数据为计数数据(即每个特征代表某个对象的整数计算,比如一个单词在句子里出现的次数)
  • BernoulliNB和MultinomialNB主要用于文本数据分类
  • GaussianNB主要用于高维数据,BernoulliNB和MultinomialNB用于稀疏计数数据
  • 参数:
    • MutinomialNB和BernoulliNB只有一个参数alpha,又被称为平滑项

decision-tree

from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor
  • sklearn只实现了树的预剪枝
  • 预剪枝的限制条件可能包括限制树的最大深度,限制叶结点的最大数目,或者规定一个结点中数据点的最小数目来防止划分

SVM

from sklearn.svm import SVC
from sklearn.svm import LinearSVC

特点

  • SVM允许决策边界很复杂,即使数据只有几个特征

  • 在低维和高维数据上表现都很好

  • SVM对参数的设定和数据的缩放非常敏感,要求所有特征有相似的变化范围。

  • 一般的处理方式是对每个特征进行缩放

高斯核SVM(RBF)

  • 选用高斯核,使用参数kernel=‘rbf’
  • 高斯核的主要参数是C参数和gamma参数,
  • c是正则化参数
  • gamma控制核宽度
  • gamma和c控制的都是模型复杂度,较大的值都对应更为复杂的模型,因此这两个参数要同时调节

ensemble

#Bagging
from sklearn.ensemble import RandomForestClassifier
  • RF一般需要调节的参数有n_estimators 和max_features,可能还包括预剪枝选项(如max_depth)
#boosting
from sklearn.ensemble import GradientBoostingClassifier
  • GBDT除了预剪枝与集成树的数量外,其重要参数是learning_rate

neural-network

from sklearn.neural_network import MLPClassifier
  • MLP通常也要预处理,常用方法是每个特征减去其平均值然后除以标准差

decision_function&predict_proba

  • sklearn中有两个函数可用于获取分类器的不确定度估计:decision_functionpredict_proba,大多数分类器都至少有其中一个函数。GradientBoostClassifier同时有两个方法

supervised summary

  • nearest-neighbors
    • 适用于小型数据集,很好的基准模型,容易理解
  • linear-model
    • 非常可靠的首选算法,适用于非常大的数据集,也适用于高维数据
  • naive-bayes
    • 只适用于分类问题。比线性模型速度还要快,适用于非常大的数据集和高维数据。精度通常要低于线性模型
  • decision-tree
    • 速度很快,不需要数据缩放,可以可视化,很容易理解
  • random-forest
    • 几乎总比单棵树决策树的表现要好,鲁棒性很好,非常强大。不需要数据缩放。不适用于高维稀疏数据
  • GBDT
    • 精度通常比随机森林要高。与随机森林相比,训练速度更慢,但预测速度更快,需要的内存也更少。比随机森林需要更多的参数调节
  • SVM
    • 对于特征含义相似的中等大小的数据集很强大。需要数据缩放,对参数敏感
  • neural-network
    • 可以构建非常复杂的模型,特别是对于大型数据集而言。对数据缩放敏感,对参数选取敏感。大型网络需要很长的训练时间。

4.unsupervised

缩放

from sklearn.preprocessing import StandardScaler
#确保每个特征的平均值为0,方差为1,使所有特征都位于同一量级,但这一缩放不能保证特征#任何特定的最大和最小值
from sklearn.preprocessing import RobustScaler
#与StandardScaler类似,但是使用中位数和四分位数,这样RobusScaler会忽略与其他点#有很大不同的数据点。这些与众不同的点叫异常值(outlier)
from sklearn.preprocessing import MinMaxScaler
#MInMaxScaler移动数据,使得所以特征都刚好位于0到1之间。对于二维数据集来说,所有的#数据都包含在x轴0到1与y轴0到1组成的矩形中
from sklearn.preprocessing import Normalizer
#Normalizer对每个数据点进行缩放,使得特征向量的欧式长度等一1。也就相当于将一个数据点投射到半径为1的圆上(高维数据是球面)。这意味着每个点的缩放比例都不相同(乘以长度的倒数)。如果只有数据的方向(或者角度)是重要的,而特征向量的长度无关紧要,那么通常会使用这种归一化

MinMaxScaler示例

from sklearn.preprocessing import MinMaxScaler
#学习放缩器
scaler = MinMaxScaler()
scaler.fit(X_train)
#将放缩器应用于数据
X_scaled = scaler.transform(X_train)
X_scaled.min(axis=0)
X_scaled.max(axis=0)

scaled_min
scaled_max

  • 同样的也可以对测试集做同样的放缩
X_test_scaled =scaler.transform(X_test)

test_scaled_min

对测试集进行放缩之后的范围并非在(0,1),这是正常的。因为放缩器由训练集训练而来,它将会对训练集和测试集进行相同的放缩

在SVM上应用特征变换示例

#变换前
from sklearn.svm import SVC
svm = SVC(C=100).fit(X_train,y_train)
print("Train set accuracy:{:.2f}".format(svm.score(X_train,y_train)))
print("Test set accuracy:{:.2f}".format(svm.score(X_test,y_test)))

SVM变换前

#对数据进行缩放,随后再使用SVM
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled =scaler.transform(X_test)

svm1 = SVC(C=100).fit(X_train_scaled,y_train)
print("Train set accuracy:{:.2f}".format(svm1.score(X_train_scaled,y_train)))
print("Test set accuracy:{:.2f}".format(svm1.score(X_test_scaled,y_test)))

SVM变换后

降维,特征,流形

利用无监督学习进行特征变换可能有多种目的。最常见的目的就是可视化,压缩数据,以及寻找信息量最大的数据表以用于进一步的处理

principle component analysis(PCA)

  • PCA可以用来降维也可以用来进行特征提取
  • PCA的参数可以选择白化(whitening),它将主成分缩放到相同的尺度。变换结国于使用StandardScalar相同。白化不仅对应于旋转数据,还对应于缩放数据使其形状是圆形而不是椭圆
#PCA
##进行PCA之前已经进行了standardscaler缩放
from sklearn.decomposition import PCA
#保留前2个主成分,训练PCA模型
pca =PCA(n_components=2)
pca.fit(X_scalar)

#应用PCA
X_pca = pca.transform(X_scalar)
print("Original shape:{}".format(X_scalar.shape))
print("Reduced shape:{}".format(X_pca.shape))

PCAshape

#PCA降维之后使用SVM
from sklearn.svm import SVC
svm = SVC(C=100).fit(X_scalar,y_train)
print("Train set accuracy:{:.2f}".format(svm.score(X_scalar,y_train)))
print("Test set accuracy:{:.2f}".format(svm.score(X_test_scalar,y_test)))

在这里插入图片描述

print("PCA components:\n{}".format(pca.components_))

PCAcomponent

#PCA matshow
plt.matshow(pca.components_,cmap='viridis')
plt.yticks([0,1],["First component","Second component"])
plt.colorbar()
plt.xticks(range(len(train.columns)),train.columns,rotation=60,ha='left')
plt.xlabel("Feature")
plt.ylabel("Principal components")

在这里插入图片描述

PCA应用于特征提取

特征提取其实是对PCA的另外一理解

理解1:尝试找到一些数字(PCA旋转之后的新特征值),使我们将测试点表示为主成分的加权求和
理解2:仅使用一些成分对原始数据进行重建

非负矩阵分解(non-negative matrix factorization,NMF)

PCA中,我们想要的是正交分量,并且能够解释尽可能多的数据方差

NMF中,希望分量和系数均为非负,也就是,希望分量和系数都大于或等于0

PCA试图找到数据中方差最大的方向,而NMF试图找到累加的分量,这通常对应于数据的“极值”或“部分”。两种方法都试图将数据点表示为一些分量之和

  • NMF与PCA类似,试图将每个数据点写成一些分量的加权求和
  • NMF只能应用于每个特征都是非负的数据,因为非负分量的非负求和不可能变为负值
  • NMF可以使用在对混合信号的分解上,一般效果很好
from sklearn.decomposition import NMF
nmf = NMF(n_components = 15 ,random_state=0)
#使用方法与PCA相同,下来进行fit,训练出分类器后调用transform使用

流形学习(manifold learning algorithm)

  • 流形学习算法主要用于可视化。一般用来寻找训练数据的二维表示,它仅依据原始空间中数据点之间的靠近程度就能够将各个类别明确分类
  • 流形学习对探索性数据分析很有用
  • 流形学习常见的算法是t-SNE。t-SNE背后的思想是找到数据的表示,然后尝试让在原始特征空间中距离较近的点更加靠近,原始特征空间中相距较远的点更加远。t-SNE重点关注距离较近的点,而不是保持距离较远的点之间的距离。换言之,它试图保存那些表示哪些点比较靠近的信息
#t-SNE不支持变换新数据,所以t-SNE类没有transform方法。可以调用#fit_transform方法来代替,它会构建模型并立刻返回变换后的数据
from sklearn.manifold import TSNE
tsne = TSNE(random_state=42)
train_tsne = tsne.fit_transform(train)

cluster

KMeans

  • kmeans把每个数据点分配给最近的簇中心,然后将每个簇中心设置为所分配的所有数据点的平均值,如果簇的分配不再发生变化,那么算法结束
  • Kmeans运行速度较快,可以轻松扩展到大型数据集。但是,Kmeans依赖于随机初始化,也就是说,算法的输出依赖于随机种子,其次,它对簇形状的假设的约束性较强,Kmeans无法识别非球形簇,而且还需要指定簇的个数,而这一个数在现实中通常不知道
  • 可以将kmeans看作分解的过程,即就是矢量量化(vector quantization)。此时,用一个分量来表示每个数据点,该分量由簇类中心给出
kmeans = KMeans(n_clusters=3)	//指定簇个数,如果不指定,簇默认为8
kmeans.fit(X)
//keans.labels_ 中保存着簇为每个训练点分配的类标签
kmeans.predict(X)

凝聚聚类(agglomerative clustering)

  • 凝聚聚类(agglomerative clustering)指的是许多基于相同原则构建的聚类算法

  • 凝聚聚类同样无法分离像two_moons数据集这样复杂的形状

  • sklearn中事项了三种凝聚聚类的合并方式

    • ward:默认选项,挑选两个簇来合并,使得所有簇中的方差增加最小。这通常会得到大小差不多相等的簇
    • average:将簇中所有点之间平局距离最小的两个簇合并
    • complete:又称为最大链接,将簇中点之间最大距离最小的两个簇合并
  • AgglomerativeClustering没有predict方法,改之使用fit_predict方法

from sklearn.cluster import AgglomerativeClustering
agg = AgglomerativeClustering(n_clusters=3)
assignment = agg.fit_predict(X)
  • 凝聚聚类合并的过程,生成了层次聚类(hierarchical clustering),可以使用Scipy中的dendrogram和ward绘制对应的树状图

    from scipy.cluster.hierarchy import dendrogram,ward
    

DBSCAN

  • DBSCAN(density-based spatial clustering of applications with noise,具有噪声的基于密度的空间聚类应用)
  • DBSCAN不需要先验的设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点,同时也可以扩展到相对较大的数据集,但是它的速度比凝聚聚类和k均值稍慢
  • DBSCAN主要的概念为三个点:核心点(core point),边界点(boundary point),噪声(noise)
  • 与凝聚聚类类似,DBSACAN也不允许对新的测试数据进行预测,所以仍旧使用fit_predict方法执行聚类并返回簇标签
from sklearn.cluster import DBSCAN
dbscan = DBSCAN()
clusers = dbscan.fit_predict(X)
# 打印类标签
print(clusers)

聚类算法对比和评估

  • 如果有真实的聚类结果可以使用的评估方法是调整rand指数(adjusted rand index,ARI)和归一化互信息(normalized mutual information,NMI),二者都给出了定量的度量,最佳值为1,0表示不相关的聚类

    from sklearn.metrics.cluster import adjusted_rand_score
    adjusted_rand_score(y,clusters_predict)
    
  • 轮廓系数(silhouette coeffcient)不需要真实值,但是在实践中的效果不好。轮廓系数计算一个簇的紧致度,其值越打越好,最高分数为1。虽然紧致的簇很好,但紧致度不允许复杂的形状。

    from sklearn.metrics.cluster import silhouette_score
    
  • 评估聚类,稍好的方式是基于鲁棒性的指标(robustness-based)。其思想是,如果许多算法参数和许多数据扰动返回相同的结果,那么它很可能是可信的。然而sklearn暂时未实现该策略。

cluster小结

  • KMeans 和凝聚聚类指定需要的簇的数量,DBSCAN允许使用eps参数定义接近的程度
  • KMeans可以用簇的平均值来表示簇,可以看做一种分解方法,每个数据点都由其簇中心表示;DBSCAN可以检测到没有分配任何簇的“噪声点”,还可以帮助自动判断簇的数量,DBSCAN也允许簇具有复杂的结构;凝聚聚类提供簇可能划分的层次结构,可以使用树状图来查看。

5.估计器(estimator)小结

  1. 首先对要使用的算法类进行对象实例化

    from sklearn.linear_model import LogisticRegression
    logreg = LogisticRegression()
    
  2. 实例化之后使用fit方法来构建模型,fit方法的第一个参数总是数据X,用一个Numpy数组或Scipy稀疏矩阵表示,第二个参数为y,它是一维Numpy数组,包含回归或分类的目标值(标签)

  3. 在sklearn中,要想穿件一个新输出形式(如y)的预测,可以使用predict方法,要想创建输入数据X的一种新表示,可以用transform方法

    estimator.fit(X_train,[y_train])
    estimator.predict(X_test)
    estimator.transform(X_test)
    

类进行对象实例化

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
  1. 实例化之后使用fit方法来构建模型,fit方法的第一个参数总是数据X,用一个Numpy数组或Scipy稀疏矩阵表示,第二个参数为y,它是一维Numpy数组,包含回归或分类的目标值(标签)

  2. 在sklearn中,要想穿件一个新输出形式(如y)的预测,可以使用predict方法,要想创建输入数据X的一种新表示,可以用transform方法

    estimator.fit(X_train,[y_train])
    estimator.predict(X_test)
    estimator.transform(X_test)
    
  3. 所有的监督模型都有score(X_test, y_test)方法,可以评估模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值