sklearn 预测数据处理(15个使用频率很低的SkLearn模型)
sklearn 预测数据处理(15个使用频率很低的SkLearn模型)df.head(5) 因为我们将同时使用分类模型和回归模型,我需要一个离散的和连续的Y。对于连续目标,我决定使用温度。对于离散目标,我使用了降水类型特征。对于我的预测特征,我将使用湿度特征:importpandasaspd importNumPyasnp df=pd.read_csv("weatherHistory.csv") 现在查看下数据:考虑到我们使用的是notebook,我认为它应该是开源的,你可以在此处查看源代码:笔记本:https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Python3/15 sklearn models.ipynb 。因为我们将要回顾分类模型以及回归模型,读取weatherHistory.csv:
SkLearn可能是Python最流行的机器学习模块之一。这是有充分理由的,因为SkLearn有非常多好的特性,有很多模型,缩放器和各种工具等!
有些模型非常有名,但是SkLearn是一个非常大的库,人就很容易忘记它附带的函数和类。虽然文档是一个很好的开始,但是扩展模型功能的另一个很好的方法是使用不同的模型。
有很多伟大的模型,使用频率很低,但是却很有用。今天我想给大家带来一些我最喜欢的SkLearn模型,也许下次你遇到一个问题时,你会想起这个模型及其相应的应用!
数据
今天,我们将对模型进行拟合,以演示上述模型的用法。当然,要做到这一点,我们需要通过一些一维数组来作为预测特征。简单来说,我们需要数据来训练。
考虑到我们使用的是notebook,我认为它应该是开源的,你可以在此处查看源代码:
笔记本:https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Python3/15 sklearn models.ipynb 。
因为我们将要回顾分类模型以及回归模型,读取weatherHistory.csv:
importpandasaspd
importNumPyasnp
df=pd.read_csv("weatherHistory.csv")
现在查看下数据:
df.head(5)
因为我们将同时使用分类模型和回归模型,我需要一个离散的和连续的Y。对于连续目标,我决定使用温度。对于离散目标,我使用了降水类型特征。对于我的预测特征,我将使用湿度特征:
caty="PrecipType"
cony="Temperature(C)"
x="Humidity"
现在我们将数据拆分为两个数据帧,训练和测试集:
fromsklearn.model_selectionimporttrain_test_split
train test=train_test_split(df)
当然我不会对这些数据做太多的处理,只是为了拟合一些模型作为例子。请记住,这些模型不能拟合有缺失值的数据。我们通过以下代码得到数据帧中缺少值计数的总和。
df.isnull().sum()
通过这个错误,查看null值应该是使用is_null函数。
看看摘要:
FormattedDate0
Summary0
PrecipType517
Temperature(C)0
ApparentTemperature(C)0
Humidity0
WindSpeed(km/h)0
WindBearing(degrees)0
Visibility(km)0
LoudCover0
Pressure(millibars)0
DailySummary0
dtype:int64
我们放弃一些不好的样本:
df=df.dropna()
fromsklearn.model_selectionimporttrain_test_split
train test=train_test_split(df)
现在把它放到一维数组中:
trainX=train[x]
cattrainy=train[caty]
contrainy=train[cony]
testX=test[x]
cattesty=test[caty]
contesty=test[cony]
SkLearn通常要求将这些数组重新调整为垂直,因为它更喜欢矩阵列中的特征,而不是矩阵行中的特征。
我们重塑,然后准备拟合一些模型。为了做到这一点,我们需要把这些一维数组变成NumPy数组。这是因为SkLearn与NumPy的集成度要高得多,尽管它确实像Pandas系列,但在很多情况下NumPy数组更具动态性,更常用:
trainX=np.array(trainX)
cattrainy=np.array(cattrainy)
contrainy=np.array(contrainy)
testX=np.array(testX)
cattesty=np.array(cattesty)
contesty=np.array(contesty)
trainX=trainX.reshape(-1 1)
cattrainy=cattrainy.reshape(-1 1)
contrainy=contrainy.reshape(-1 1)
testX=testX.reshape(-1 1)
cattesty=cattesty.reshape(-1 1)
contesty=contesty.reshape(-1 1)
对于回归问题
通常用于监督模型的两种不同类型的其中一种模型就是回归模型。这些模型预测的值是定量的,而不是定性的。也就是说,这些模型中的许多都将利用回归来估计连续值。
1:保序回归保序回归,或单调回归是一种可怕的回归形式,许多机器学习工程师甚至从未听说过。保序回归是一种非常精确的预测连续目标的模型,但在这方面也有其局限性。这方面的一个很好的例子是,这个模型往往容易过拟合,而要使模型正常工作,往往需要平衡偏差并努力提高准确度。
这个模型的另一个重要问题是数据必须是非递减的。这意味着此模型的典型应用程序通常涉及经济和业务场景。考虑到这一点,虽然这个模型可能对处理经济数据的人非常有用,但对于许多科学工作来说,它不一定是最好的模型。
然而,保序回归在适当的应用和平衡偏差可以是一个非常强大的预测模型!如果你想了解关于保序回归的更多信息,可以看看这两篇文章:
https://towardsdatascience.com/building-and-using-an-isotonic-regression-model-in-c-f6789d46ab07
https://towardsdatascience.com/isotonic-regression-is-the-coolest-machine-learning-model-you-might-not-have-heard-of-3ce14afc6d1e
为了拟合这个模型,我们首先需要使用make_regressor函数,它将为我们提供一个基本的回归模型,在这个模型上可以建立保序回归。这样做:
fromsklearn.isotonicimportIsotonicRegression
fromsklearn.datasetsimportmake_regression
isox isoy=make_regression(n_samples=10 n_features=1 random_state=41)
m.fit(isox isoy)
m=IsotonicRegression(trainX contrainy)
m=IsotonicRegression()
m.fit(isox isoy)
m.predict(testX)
2:正交匹配追踪(Orthagonal Matching Pursuit)
另一个只适用于某些数据特征的非常有用的工具是正交匹配追踪。该模型用于提取稀疏编码信号,去除数据中的噪声和异常。这意味着这些机器学习算法被用来根据数据修正某些输入信号,我认为这是机器学习的一个非常好的应用。
虽然正交匹配追踪的主要用途可能相对简单,但该模型的用途可能更为广泛。鉴于这是一个非常独特的光谱模型,它是如何工作的?
正交匹配追踪形成了其名称中描述的精确运算。为了剖析这个定义,让我们分别看一下这些词:
- 正交——涉及直角的;
- 匹配——将观察值与值联系起来;
- 追踪——寻找。
因此,基本上,我们正在寻找与数据的完美匹配,因为它依赖于多维数据空间D,这可能是编程世界中的一个字典类型。维基百科解释为:其思想是从Hilbert空间(H)中创建一个近似信号(f),作为统计函数的加权和,即PDFs/CDFs/Gamma。
虽然我们所拥有的数据对于这个特定的模型来说并不是一个很好的应用,但是对于这个例子,我将创建一些稀疏信号作为数据传递:
fromsklearn.linear_modelimportOrthogonalMatchingPursuit
fromsklearn.datasetsimportmake_sparse_coded_signal
n_components n_features=550 100
n_nonzero_coefs=10
#y=Xw
#|x|_0=n_nonzero_coefs
y X w=make_sparse_coded_signal(n_samples=1
n_components=n_components
n_features=n_features
n_nonzero_coefs=n_nonzero_coefs
random_state=0)
idx =w.nonzero()
现在我们将给目标数据加噪声:
y_noisy=y 0.05*np.random.randn(len(y))
拟合模型:
omp=OrthogonalMatchingPursuit(n_nonzero_coefs=n_nonzero_coefs)
omp.fit(X y)
coef=omp.coef_
idx_r =coef.nonzero()
3:LARS LASSO
如果你已经使用机器学习很长一段时间了,很可能你听说过LASSO回归。LASSO回归是一个奇妙的和相当标准化的工具,已经在机器学习中经常使用了很长一段时间了。大多数时候,在预测连续目标时,这无疑是我首选的模型。
然而,LARS LASSO模型不是你的正常LASSO回归。“LARS-lasso模型”中的LARS是最小角度回归(Least Angle regression)的简称。最小角度回归是一种用于预测连续特征的机器学习算法。它在处理具有难以置信的高维数据时最有用。
这个模型的一个优点是,虽然该模型比较大,但与通常以这种方式使用的模型相比,它并不是特别慢。重要的是要记住,虽然这个模型是从最小角度回归得出的,但这并不意味着它是线性的(LASSO部分)。当然,如果你要找的是线性模型,你可以在传统的线性回归模型上使用相同的概念,使用最小角度回归。
fromsklearnimportlinear_model
reg=linear_model.LassoLars(alpha=0.01)
reg.fit(trainX contrainy)
reg.predict(testX)
4:最小角度回归
正如在LASSO模型的最小角度回归的类似应用中所讨论的,最小角度回归是一种用于预测连续特征的模型,通常通过使用协变量的线性子集来工作。这是最小角度回归和LARS-Lasso回归最显著的区别。最小角度回归是指该模型的线性版本。
在计算上,最小角度回归速度也很快。虽然这是一个巨大的好处,但它最大的优点是在p>>n的情况下。如果两个变量具有相同的相关性,那么它们的系数应该以相同的速率增加。
fromsklearnimportlinear_model
reg=linear_model.Lars()
reg.fit(trainX contrainy)
reg.predict(testX)
5:SGDRegressor
SkLearn中一个概念的另一个伟大实现是随机梯度下降。
随机梯度下降法是一种迭代优化数学函数和构造成本函数的方法。很可能你听说过梯度下降,这是类似的-然而,在这个模型的名称随机意味着,我们在一个epoch只使用一个样本。这是两个极端中的一个,梯度下降使用整个数据集,中间的mini-batch是两者的折中。
在随机梯度下降过程中,每次估计每个样本的损失梯度,然后按照迭代公式更新模型。
fromsklearn.linear_modelimportSGDRegressor
m=SGDRegressor()
m.fit(trainX contrainy)
m.predict(testX)
6:Huber回归
使用回归学习方法时,模型往往存在难以克服的缺点。这当然适用于线性模型,它可能很难完美地拟合稀疏数据或多维数据。幸运的是,SkLearn有一个不错的Huber回归实现。
这种形式的回归可以用来处理异常值,并避免使用SkLearn包中提供的典型模型很容易产生的模型错误。虽然此模型很有用并且拟合得很好,但它也相对简单,这意味着在使用这个模型时不会遇到过拟合和过采样的典型问题。
Huber回归优化了平方损失(均方误差),与简单线性回归等模型相比,它对异常值具有相当强的鲁棒性。实际上,斯坦福大学的Art B.Owen发表了一篇非常有趣的论文,对于那些不熟悉或不熟悉这种建模方法的人来说,这篇论文可能值得一看。如果你感兴趣,可以查看:https://statweb.stanford.edu/~owen/reports/hhu.pdf 。
以下是我发现的很有用的一句话,用于从数学上分析这个模型将如何处理这些异常数据:
“最小二乘准则非常适用于具有高斯分布的yi,但当yi具有更大的尾分布或几乎相同的分布时,当存在异常值时,则会产生较差的性能。Huber(1981)描述了一种稳健估计方法,它采用的损失函数受其影响较小。”
不用说,这个模型非常酷!我认为它在剔除异常值方面确实有用,因为这是导致预测连续问题困难的一个因素——这通常是轻描淡写的,但在基础统计学领域似乎很明显。
现在我们已经在数学上熟悉了这个模型,实际上我们可以考虑将它应用到Sklearn中。
fromsklearn.linear_modelimportHuberRegressor
m=HuberRegressor()
m.fit(trainX contrainy)
m.predict(testX)
7:多项式回归
虽然这个“模型”可能更像概念,可以与其他模型一起使用,但它肯定会非常有用!机器学习的一个非常常见的模型是使用非线性函数来创建线性预测。这将在不浪费任何预测能力的情况下保持模型的速度。一个很好的例子就是简单线性回归上的多项式回归。
在使用多项式回归的例子中,它适用于用函数建立的高维数据。由于使用了多项式特征,该模型可以很容易地拟合和求解广泛的连续问题。
为了在sklearn中实际使用多项式回归,我们将实际使用PolynomialFeatures:
fromsklearn.preprocessingimportPolynomialFeatures
poly=PolynomialFeatures(2)
poly.fit_transform(trainX)
fromsklearn.linear_modelimportLinearRegression
reg=LinearRegression()
reg.fit(trainX contrainy)
reg.predict(testX)
8:普通最小二乘法
普通最小二乘法是另一个非常酷的预测连续特征的数学机器学习模型。普通最小二乘法也是一种线性模型,适用于为使数据点之间的平方和最小化而创建的系数。
普通最小二乘法的权值在很大程度上依赖于特征的独立性来预测目标。也就是说,这个模型对于具有单一特征的实现非常有用。此外,它也可以与多个特征一起使用。
不幸的是,OLS的SkLearn实现没有大多数实现那么简单。OLS系数实际上包含在LinearRegression类的下面,如.coef_所示:
linear_model.LinearRegression().fit(trainX contrainy).coef_
9:NuSVR
回到支持向量机的神奇之处,让我向你介绍NuSVR。NuSVR当然是与NuSVC相同的模型和机器实现。这两种模型都使用libsvm并使用一个参数nu来控制机器中支持向量的数量。但是,与NuSVC不同,nu替换C,这里nu替换epsilon SVR的参数epsilon。
使用该模型的优点是,为向量机的调整提供了参数,该向量机用于协助估计回归问题。也就是说,这个模型非常适合预测连续的特征,这些特征对我们的目标可能非常重要,也可能不重要。
fromsklearn.svmimportNuSVR
fromsklearn.svmimportNuSVR
m=NuSVR()
m.fit(trainX contrainy)
m.predict(testX)
10:多任务LASSO
和 LARS las一样,你很可能听说过LASSO回归。作为复习,这是一个非常常用的预测连续特征的非线性模型。多任务LASSO的区别在于,多任务LASSO将使用L1/L2范数作为正则化。
为了证明这一点,让我们看看Lasso回归的优化目标:
(1/(2*n_samples))*||Y-XW||^2_Fro alpha*||W||_21
在本例中,||W||_21将被修改以适合多任务LASSO的公式:
本质上,这意味着我们得到的是每一行的总和。
fromsklearn.linear_modelimportMultiTaskLasso
m=MultiTaskLasso()
m.fit(trainX contrainy)
m.predict(testX)
对于分类问题
在机器学习中,可能会有很多连续的问题,但是同样的,分类问题也很多。
11:LinearSVCLinearSVC是一种支持向量机类型的模型。支持向量机模型的SkLearn实现是使用libsvm创建的。虽然核可以是非线性的,但它的SMO通常不能很好地扩展到大量样本。这就是线性支持向量分类器派上用场的地方。
也就是说,虽然在Sklearn中还有其他一些更著名的SVC实现,但LinearSVC绝对是一个值得关注的模型!SVC通常在多类模式下工作,实现时使用OvO。在线性SVC的情况下,使用OvR。这使模型更全面。
至于SkLearn类,它是一个很棒的、近乎完美的实现。它非常好地支持密集和稀疏数据,并且可以成为一个令人难以置信的模型——在我看来,它是Python中最适合线性分类的模型之一!
fromsklearn.svmimportLinearSVC
m=LinearSVC()
m.fit(trainX cattrainy)
m.predict(testX)
12:SGDClassifier
正如我们在简要讨论SGDRegressor时所讨论的,随机梯度下降是指在每次迭代的成本中,只使用一个样本。当然,SGDClassifier与现在应用于分类问题的概念完全相同。
与SGDRegressor一样,这个模型是一个很好的实现,特别是在处理大量特征时,它是很有价值的。虽然性能可能会大幅下降,但可能需要权衡使用更复杂模型带来的成本问题。
使用SGDRegressor是非常简单的,与此列表中的许多模型一样,将遵循典型的SkLearn约定
- import
- fit
- predict
fromsklearn.linear_modelimportSGDClassifier
m=SGDClassifier()
m.fit(trainX cattrainy)
m.predict(testX)
13:伯努利朴素贝叶斯
伯努利朴素贝叶斯分类模型可以像使用任何贝叶斯分类模型一样使用,但是它确实有一个技巧:
伯努利分布
你可能熟悉这种分布,因为它的CDF经常出现在logistic分类模型。我想说这个模型的用法和多项式的用法非常相似。然而,虽然多项式NB在计数方面的效果明显更好,但BernoulliNB使用了Bernoulli分布,并且是为布尔型特征设计的。伯努利分布用于logistic回归,也就是说,这个模型有着本质上相同的用途,所以它使用相同的分布是有意义的。
尽管此模型通常用于预测二元特征,但今天我们将传递一些可能更适用于多项式nb的离散数据。也就是说,记住这两个模型的用例是很重要的,因为它们非常强大,但是应该用于它们相应的特征类型。
如果你不了解你试图预测的目标,那么使用一个模型是没有意义的,我认为这些模型之间的差异凸显了数据科学家的作用,不同的模型需要不同类型的特征才能很好地工作。但不管怎样,它遵循了我们期望从SkLearn学到的典型用法:
fromsklearn.naive_bayesimportBernoulliNB
m=BernoulliNB()
m.fit(trainX cattrainy)
m.predict(testX)
14:RidgeClassification
如果你一直在使用机器学习模型,特别是回归模型,你很可能听说过岭回归。岭回归是一种常用的连续特征预测模型。对于分类问题,RidgeClassification当然是这个精确模型的分类等价物。
模型的分类版本将目标转换为{-1,1},然后将其建模为具有典型岭回归的回归问题。我认为这是一个非常酷的概念,因为在我看来,将回归和其他解决问题的连续方法应用于一个完全不同的问题(如分类)是非常酷的。
幸运的是,尽管这个模型非常棒,看起来像是一个先进的概念,但SkLearn让它非常容易地使用:
fromsklearn.linear_modelimportRidgeClassifier
m=RidgeClassifier()
m.fit(trainX cattrainy)
m.predict(testX)
15:CalibratedClassifierCV
可能这个列表中最酷的模型之一是CalibredClassifierCV。该模型使用交叉验证来估计分类器的参数。该模型以logistic回归为基础,是一个很好的布尔型分类模型。
然而,由于这个模型实际上可以采用不同的基估计,一个常用的模型实际上是保序回归。保序回归是一个非常酷的模型,但在我看来,当与分类问题结合起来时,它会变得酷得多。这意味着阈值现在附加到类,而不是连续数据中的任意数。
与此列表中许多用于预测目标的其他解决方案不同,这是另一个用于其他模型的附加解决方案。在这个例子中,我将用高斯朴素贝叶斯建立一个分类模型。
fromsklearn.naive_bayesimportGaussianNB
fromsklearn.calibrationimportCalibratedClassifierCV
base_clf=GaussianNB()
calibrated_clf=CalibratedClassifierCV(base_estimator=base_clf cv=3)
calibrated_clf.fit(trainX cattrainy)
calibrated_clf.predict(testX)
结论
SkLearn是一个非常棒的库,现在的机器学习工程师可能认为它是理所当然的。库里有很多模型是绝对难以置信的,可能会因为已经有了冠军模型而被忽略。你用过多少这种模型?希望这些描述和介绍这些模型令你感到有趣,甚至可能有助于为你的下一个项目选择这些模型。
非常感谢你的阅读!