96SEO 2026-02-19 18:55 19
Python是一种跨平台的计算机程序设计语言。

是一种面向对象的动态类型语言最初被设计用于编写自动化脚本(shell)随着版本的不断更新和语言新功能的添加越多被用于独立的、大型项目的开发。
Python是一种解释型脚本语言可以应用于以下领域
Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
编程语言中的各种工具和库来实现机器学习算法和技术的过程。
Python
是一种功能强大且易于学习和使用的编程语言因此成为了机器学习领域的首选语言之一。
Python
提供了丰富的机器学习库如Scikit-learn、TensorFlow、Keras、PyTorch等这些库包含了许多常用的机器学习算法和深度学习框架使得开发者能够快速实现、测试和部署各种机器学习模型。
监督学习包括分类、回归等任务。
无监督学习如聚类、降维等。
半监督学习结合了有监督和无监督学习的技术。
强化学习通过与环境的交互学习来优化决策策略。
深度学习利用深度神经网络进行学习和预测。
进行机器学习开发者可以利用其丰富的工具和库来处理数据、构建模型、评估模型性能并将模型部署到实际应用中。
Python
的易用性和庞大的社区支持使得机器学习在各个领域都得到了广泛的应用和发展。
在机器学习中的特征工程中单变量非线性变换是一种将单个特征应用非线性函数的技术以便提高模型性能或满足模型假设。
这些变换有助于处理特征与目标变量之间的非线性关系。
常见的单变量非线性变换包括对数变换、平方根变换、平方变换、指数变换等。
对数变换常用于将具有右偏分布的数据拉近正态分布。
它在处理正数数据时特别有用。
train_test_split(california.data,
平方根变换用于减弱特征中较大的数值的影响。
它在处理计数数据时特别有用。
plt.title(Square-root-transformed
平方变换用于增加特征的非线性性。
它在处理特征与目标之间具有二次关系的数据时有用。
plt.title(Exponential-transformed
log_transformer.transform(X_train)
log_transformer.transform(X_test)print(Original
X_train_log.shape)这些非线性变换可以帮助捕捉特征和目标变量之间的复杂关系从而提高模型的性能。
选择适当的变换方法取决于数据的分布和模型的需求。
添加特征的平方或立方可以改进线性回归模型。
其他变换通常也对变换某些特征有用特别是应用数学函数比如
。
虽然基于树的模型只关注特征的顺序但线性模型和神经网络依赖于每个特征的尺度和分布。
如果在特征和目标之间存在非线性关系那么建模就变得非常困难特别是对于回归问题。
log
函数可以帮助调节数据的相对比例从而改进线性模型或神经网络的学习效果。
我们之前对内存价格数据应用过这种函数。
在处理具有周期性模式的数据时sin
大部分模型都在每个特征在回归问题中还包括目标值大致遵循高斯分布时表现最好也就是说每个特征的直方图应该具有类似于熟悉的“钟形曲线”的形状。
使用诸如
之类的变换并不稀奇但却是实现这一点的简单又有效的方法。
在一种特别常见的情况下这样的变换非常有用就是处理整数计数数据时。
计数数据是指类似“用户
多长时间登录一次”这样的特征。
计数不可能取负值并且通常遵循特定的统计模式。
下面我们使用一个模拟的计数数据集其性质与在自然状态下能找到的数据集类似。
特征全都是整数值而响应是连续的
appearances:\n{}.format(np.bincount(X[:,
plt.xlabel(Value)plt.tight_layout()
plt.savefig(Images/04UnivariateNonlinearTransformation-01.png,
具有类似的性质。
这种类型的数值分布许多较小的值和一些非常大的值在实践中非常常见这是泊松分布对计数数据相当重要。
但大多数线性模型无法很好地处理这种数据。
我们尝试拟合一个岭回归模型
plt.xlabel(Value)plt.tight_layout()
plt.savefig(Images/04UnivariateNonlinearTransformation-02.png,
为数据集和模型的所有组合寻找最佳变换这在某种程度上是一门艺术。
在这个例子中所有特征都具有相同的性质这在实践中是非常少见的情况。
通常来说只有一部分特征应该进行变换有时每个特征的变换方式也各不相同。
前面提到过对基于树的模型而言这种变换并不重要但对线性模型来说可能至关重要。
对回归的目标变量
进行变换有时也是一个好主意。
尝试预测计数比如订单数量是一项相当常见的任务而且使用
变换也往往有用。
(这是对泊松分布非常粗略的近似而从概率的角度来看这是正确的解决方法)
从前面的例子中可以看出分箱、多项式和交互项都对模型在给定数据集上的性能有很大影响对于复杂度较低的模型更是这样比如线性模型和朴素贝叶斯模型。
与之相反基于树的模型通常能够自己发现重要的交互项大多数情况下不需要显式地变换数据。
其他模型比如
SVM、最近邻和神经网络有时可能会从使用分箱、交互项或多项式中受益但其效果通常不如线性模型那么明显。
自动化特征选择是机器学习中用于提高模型性能和减少模型复杂性的重要步骤。
通过自动化特征选择我们可以选择对模型预测有显著影响的特征去除冗余或不相关的特征从而提高模型的泛化能力和训练效率。
有了这么多种创建新特征的方法你可能会想要增大数据的维度使其远大于原始特征的数量。
但是添加更多特征会使所有模型变得更加复杂从而增大过拟合的可能性。
在添加新特征或处理一般的高维数据集时最好将特征的数量减少到只包含最有用的那些特征并删除其余特征。
这样会得到泛化能力更好、更简单的模型。
但你如何判断每个特征的作用有多大呢有三种基本的策略单变量统计
selection。
我们将详细讨论这三种策略。
所有这些方法都是监督方法即它们需要目标值来拟合模型。
这也就是说我们需要将数据划分为训练集和测试集并只在训练集上拟合特征选择。
在单变量统计中我们计算每个特征和目标值之间的关系是否存在统计显著性然后选择具有最高置信度的特征。
对于分类问题这也被称为方差分析
varianceANOVA。
这些测试的一个关键性质就是它们是单变量的
univariate即它们只单独考虑每个特征。
因此如果一个特征只有在与另一个特征合并时才具有信息量那么这个特征将被舍弃。
单变量测试的计算速度通常很快并且不需要构建模型。
另一方面它们完全独立于你可能想要在特征选择之后应用的模型。
值来选择一种舍弃特征的方法。
所有舍弃参数的方法都使用阈值来舍弃所有
值过大的特征意味着它们不可能与目标值相关。
计算阈值的方法各有不同最简单的是
数据集。
为了使任务更难一点我们将向数据中添加一些没有信息量的噪声特征。
我们期望特征选择能能够识别没有信息量的特征并删除它们
rng.normal(size(len(cancer.data),
使用f_classif默认值和SelectPercentile来选择50%的特征
select.transform(X_train)print(X_train.shape:
{}.format(X_train_selected.shape))
方法来查看哪些特征被选中它会返回所选特征的布尔遮罩mask其可视化见图
plt.savefig(Images/05AutomatedFeatureSelection-01.png,
你可以从遮罩的可视化中看出大多数所选择的特征都是原始特征并且大多数噪声特征都已被删除。
但原始特征的还原并不完美。
我们来比较
{:.3f}.format(lr.score(X_test_selected,
在这个例子中删除噪声特征可以提高性能即使丢失了某些原始特征。
这是一个非常简单的假想示例在真实数据上的结果要更加复杂。
不过如果特征量太大以至于无法构建模型或者你怀疑许多特征完全没有信息量那么单变量特征选择还是非常有用的。
基于模型的特征选择使用一个监督机器学习模型来判断每个特征的重要性并且仅保留最重要的特征。
用于特征选择的监督模型不需要与用于最终监督建模的模型相同。
特征选择模型需要为每个特征提供某种重要性度量以便用这个度量对特征进行排序。
决策树和基于决策树的模型提供了
属性可以直接编码每个特征的重要性。
线性模型系数的绝对值也可以用于表示特征重要性。
正如我们在之前所见L1
惩罚的线性模型学到的是稀疏系数它只用到了特征的一个很小的子集。
这可以被视为模型本身的一种特征选择形式但也可以用作另一个模型选择特征的预处理步骤。
与单变量选择不同基于模型的选择同时考虑所有特征因此可以获取交互项如果模型能够获取它们的话。
要想使用基于模型的特征选择我们需要使用
SelectFromModel(RandomForestClassifier(n_estimators100,
random_state42),thresholdmedian)
类选出重要性度量由监督模型提供大于给定阈值的所有特征。
为了得到可以与单变量特征选择进行对比的结果我们使用中位数作为阈值这样就可以选择一半特征。
我们用包含
棵树的随机森林分类器来计算特征重要性。
这是一个相当复杂的模型也比单变量测试要强大得多。
下面我们来实际拟合模型
plt.savefig(Images/05AutomatedFeatureSelection-02.png,
LogisticRegression().fit(X_train_l1,
在单变量测试中我们没有使用模型而在基于模型的选择中我们使用了单个模型来选择特征。
在迭代特征选择中将会构建一系列模型每个模型都使用不同数量的特征。
有两种基本方法开始时没有特征然后逐个添加特征直到满足某个终止条件或者从所有特征开始然后逐个删除特征直到满足某个终止条件。
由于构建了一系列模型所以这些方法的计算成本要比前面讨论过的方法更高。
其中一种特殊方法是递归特征消除
eliminationRFE它从所有特征开始构建模型并根据模型舍弃最不重要的特征然后使用除被舍弃特征之外的所有特征来构建一个新模型如此继续直到仅剩下预设数量的特征。
为了让这种方法能够运行用于选择的模型需要提供某种确定特征重要性的方法正如基于模型的选择所做的那样。
下面我们使用之前用过的同一个随机森林模型得到的结果如图
RFE(RandomForestClassifier(n_estimators100,
random_state42),n_features_to_select40)
plt.savefig(Images/05AutomatedFeatureSelection-03.png,
与单变量选择和基于模型的选择相比迭代特征选择的结果更好但仍然漏掉了一个特征。
运行上述代码需要的时间也比基于模型的选择长得多因为对一个随机森林模型训练了
LogisticRegression().fit(X_train_rfe,
{:.3f}.format(select.score(X_test,
回归模型得到的性能相同。
换句话说只要我们选择了正确的特征线性模型的表现就与随机森林一样好。
如果你不确定何时选择使用哪些特征作为机器学习算法的输入那么自动化特征选择可能特别有用。
它还有助于减少所需要的特征数量加快预测速度或允许可解释性更强的模型。
在大多数现实情况下使用特征选择不太可能大幅提升性能但它仍是特征工程工具箱中一个非常有价值的工具。
knowledge。
虽然在许多情况下机器学习的目的是避免创建一组专家设计的规则但这并不意味着应该舍弃该应用或该领域的先验知识。
通常来说领域专家可以帮助找出有用的特征其信息量比数据原始表示要大得多。
想象一下你在一家旅行社工作想要预测机票价格。
假设你有价格以及日期、航空公司、出发地和目的地的记录。
机器学习模型可能从这些记录中构建一个相当不错的模型但可能无法学到机票价格中的某些重要因素。
例如在度假高峰月份和假日期间机票价格通常更高。
虽然某些假日的日期是固定的比如圣诞节其影响可以从日期中学到但其他假日的日期可能取决于月相比如光明节和复活节或者由官方规定比如学校放假。
如果每个航班都只使用公历记录日期则无法从数据中学到这些事件。
但添加一个特征是很简单的其中编码了一个航班在公休假日或学校假期的之前、之中还是之后。
利用这种方法可以将关于任务属性的先验知识编码到特征中以辅助机器学习算法。
添加一个特征并不会强制机器学习算法使用它即使最终发现假日信息不包含关于机票价格的信息用这一信息来扩充数据也不会有什么害处。
下面我们来看一个利用专家知识的特例——虽然在这个例子中对这些专家知识更正确的叫法应该是“常识”。
任务是预测在
运营着一个带有付费系统的自行车租赁站网络。
这些站点遍布整个城市提供了一种方便的交通方式。
自行车出租数据以匿名形式公开Citi
并用各种方法进行了分析。
我们想要解决的任务是对于给定的日期和时间预测有多少人将会在
mglearn.datasets.load_citibike()
data:\n{}.format(citibike.head()))
pd.date_range(startcitibike.index.min(),
plt.ylabel(Rentals)plt.tight_layout()
plt.savefig(Images/05AutomatedFeatureSelection-04.png,
小时中的白天和夜间。
工作日和周末的模式似乎也有很大不同。
在对这种时间序列上的预测任务进行评估时我们通常希望从过去学习
。
也就是说在划分训练集和测试集的时候我们希望使用某个特定日期之前的所有数据作为训练集该日期之后的所有数据作为测试集。
这是我们通常使用时间序列预测的方式已知过去所有的出租数据我们认为明天会发生什么我们将使用前
在我们的预测任务中我们使用的唯一特征就是某一租车数量对应的日期和时间。
因此输入特征是日期和时间比如
时间的起点起至现在的总秒数。
首先我们可以尝试使用这个单一整数特征作为数据表示
我们首先定义一个函数它可以将数据划分为训练集和测试集构建模型并将结果可视化
target[n_train:]regressor.fit(X_train,
{:.2f}.format(regressor.score(X_test,
regressor.predict(X_test)y_pred_train
regressor.predict(X_train)plt.figure(figsize(10,
rotation90,haleft)plt.plot(range(n_train),
labeltrain)plt.plot(range(n_train,
labeltest)plt.plot(range(n_train),
0))plt.xlabel(Date)plt.ylabel(Rentals)
我们之前看到随机森林需要很少的数据预处理因此它似乎很适合作为第一个模型。
我们使用
RandomForestRegressor(n_estimators100,
plt.savefig(Images/05AutomatedFeatureSelection-05.png,
在训练集上的预测结果相当好这符合随机森林通常的表现。
但对于测试集来说预测结果是一条常数直线。
R2
时间特征的值超出了训练集中特征取值的范围测试集中数据点的时间戳要晚于训练集中的所有数据点。
树以及随机森林无法外推
extrapolate到训练集之外的特征范围。
结果就是模型只能预测训练集中最近数据点的目标值即最后一次观测到数据的时间。
显然我们可以做得更好。
这就是我们的“专家知识”的用武之地。
通过观察训练数据中的租车数量图像我们发现两个因素似乎非常重要一天内的时间与一周的星期几。
因此我们来添加这两个特征。
我们从
时间中学不到任何东西所以删掉这个特征。
首先我们仅使用每天的时刻。
如图
citibike.index.hour.to_numpy().reshape(-1,
plt.savefig(Images/05AutomatedFeatureSelection-06.png,
已经好多了但预测结果显然没有抓住每周的模式。
下面我们还添加一周的星期几作为特征见图
np.hstack([citibike.index.dayofweek.to_numpy().reshape(-1,
1),citibike.index.hour.to_numpy().reshape(-1,
plt.savefig(Images/05AutomatedFeatureSelection-07.png,
4-15随机森林使用一周的星期几和每天的时刻两个特征做出的预测
现在我们的模型通过考虑一周的星期几和一天内的时间捕捉到了周期性的行为。
它的
天中星期几与时刻每种组合的平均租车数量。
这实际上不需要像随机森林这样复杂的模型所以我们尝试一个更简单的模型——LinearRegression
LinearRegression())plt.tight_layout()
plt.savefig(Images/05AutomatedFeatureSelection-08.png,
4-16线性模型使用一周的星期几和每天的时刻两个特征做出的预测
的效果差得多而且周期性模式看起来很奇怪。
其原因在于我们用整数编码一周的星期几和一天内的时间它们被解释为连续变量。
因此线性模型只能学到关于每天时间的线性函数——它学到的是时间越晚租车数量越多。
但实际模式比这要复杂得多。
我们可以通过将整数解释为分类变量用
enc.fit_transform(X_hour_week).toarray()eval_on_features(X_hour_week_onehot,
plt.savefig(Images/05AutomatedFeatureSelection-09.png,
它给出了比连续特征编码好得多的匹配。
现在线性模型为一周内的每天都学到了一个系数为一天内的每个时刻都学到了一个系数。
也就是说一周七天共享“一天内每个时刻”的模式。
利用交互特征我们可以让模型为星期几和时刻的每一种组合学到一个系数见图
PolynomialFeaturespoly_transformer
interaction_onlyTrue,include_biasFalse)
poly_transformer.fit_transform(X_hour_week_onehot)
eval_on_features(X_hour_week_onehot_poly,
plt.savefig(Images/05AutomatedFeatureSelection-10.png,
这一变换最终得到一个性能与随机森林类似的模型。
这个模型的一大优点是可以很清楚地看到学到的内容对每个星期几和时刻的交互项学到了一个系数。
我们可以将模型学到的系数作图而这对于随机森林来说是不可能的。
poly_transformer.get_feature_names_out(features)
np.array(features_poly)[lr.coef_
plt.xticks(np.arange(len(coef_nonzero)),
plt.savefig(Images/05AutomatedFeatureSelection-11.png,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback