手把手教你可视化交叉验证代码,提高模型预测能力

本文通过实例演示如何使用K折交叉验证提升线性回归模型的预测能力。介绍如何分割数据集、选择模型、进行交叉验证及结果可视化。

我们试着利用代码可视化来提高模型预测能力~


比如说,你正在编写一个漂亮清晰的机器学习代码(例如线性回归)。你的代码还不错,首先按照往常一样用 train_test_split 这样的函数将数据集分成「训练集和测试集」两个部分,并加入一些随机因素。你的预测可能稍微欠拟合或过拟合,如下图所示。



图:欠拟合和过拟合情况下的预测结果


这些结果没有变化。这个时候我们能做什么呢?


正如题目所建议的,在学习了线性回归之后,下一件有趣的事情就是交叉验证了,因为它可以使用 K 折策略(K-Fold strategy)提高模型的预测能力。那 K 折究竟是什么呢?下面我们将用代码对此进行解释。


完整的代码如下:



图:交叉验证的可视化


代码解析:


以上代码可分为 4 个步骤。


1. 加载并分割目标数据集。



图:加载数据集


将该数据集中的目标复制到 y 变量中。如果想看到数据集,请将 print 行的注释取消。


2. 模型选择



图:模型选择(LinearRegression())


为简化过程,我们将选择使用线性回归。如果想了解更多,请查看文章《Linear Regression: The Easier Way》。


3. 交叉验证



图:在 sklearn 中进行交叉验证


这是 sklearn 中的流程,也是一个函数:


        cross_val_predict(model, data, target, cv)
      


其中,


  • model 是我们选来要进行交叉验证的模型。
  • data 是数据。
  • target 是数据的目标值。
  • cv(可选项)是数据折叠的总次数(K 折)。


在这个流程中,我们不像往常一样将数据集分成训练集和测试集两部分,如下图所示。



图:训练集(蓝色)和测试集(红色)


我们将数据集平均分成 K 个部分(K 折或者 cv)。为了提高预测精度并实现更好地泛化,我们会在较大的数据集中进行模型训练,在较小的数据集上测试。这里,我们把 cv 设置成 6。



图:6 个相同的部分


现在,模型分割的第一次迭代如下图所示,其中红色的是测试集,蓝色的是训练集。



图:交叉验证的第一次迭代


第二次迭代如下图所示:



图:交叉验证的第二次迭代


以此类推,直到最后一次迭代,如下图所示:



图:交叉验证的第六次迭代


4. 使用 Matplotlib 进行数据可视化



图:使用 Matplotlib 进行可视化


为了将结果可视化,我们导入了 matplotlib 库,然后创建一个 subplot(子图)。

创建采用黑色(即 (0,0,0))边框的散点。


使用 ax.plot 计算两个轴的最大最小值,k-- 代表线型,lw=4 代表宽度。然后,给 x 轴和 y 轴加上标签。最后,用 plt.show() 展示图像。


结果如下:



图:预测结果


这张图展示了使用线性回归模型对 Boston 数据集进行 K 折交叉验证的结果。


我知道其实还有很多种交叉验证方法,但 K 折交叉验证是一个很好、很简单的起点。


完整代码地址:https://github.com/Sagarsharma4244/Cross-Validation

<think>我们被要求手动分析tsfresh提取的时间序列特征矩阵。分析特征矩阵是理解数据、特征选择、模型构建的重要步骤。以下是一个系统化的手动分析流程: ### 1. **初步观察数据概览** - **查看数据结构**:使用`head()`, `shape`, `info()`等方法了解特征矩阵的维度和特征类型。 ```python print("特征矩阵形状:", extracted_features.shape) print("前5行:\n", extracted_features.head()) print("特征数据类型:\n", extracted_features.dtypes.value_counts()) ``` - **统计描述**:使用`describe()`查看每个特征的统计摘要(均值、标准差、最小值、最大值、分位数)。 ```python print(extracted_features.describe()) ``` ### 2. **处理缺失值** - 计算每个特征的缺失率: ```python missing_rates = extracted_features.isnull().mean().sort_values(ascending=False) ``` - 根据缺失率决定处理策略: - 缺失率>80%:考虑删除该特征 - 缺失率<80%:使用中位数/均值填充(数值特征)或众数填充(分类特征) - 使用tsfresh内置的`impute`函数: ```python from tsfresh.utilities.dataframe_functions import impute impute(extracted_features) ``` ### 3. **特征分布分析** - **绘制分布图**:使用直方图、箱线图、小提琴图等可视化每个特征的分布。 - **观察要点**: - 是否对称?偏斜方向?(左偏/右偏) - 是否存在多峰分布? - 是否有异常值? - 代码示例(使用Plotly): ```python import plotly.express as px fig = px.histogram(extracted_features, x='feature__sum_values', nbins=50, title='特征分布') fig.show() ``` ### 4. **特征相关性分析** - 计算特征之间的相关系数矩阵(Pearson/Spearman): ```python corr_matrix = extracted_features.corr() ``` - 绘制热力图识别高度相关的特征组(相关系数>0.8): ```python fig = px.imshow(corr_matrix, color_continuous_scale='RdBu_r', zmin=-1, zmax=1) fig.show() ``` - 处理高相关特征: - 删除其中之一(保留目标变量相关性更高的特征) - 使用主成分分析(PCA)降维 ### 5. **特征目标变量的关系** - 对于分类任务:绘制每个特征在不同类别下的分布(箱线图或小提琴图) ```python fig = px.box(extracted_features, x='target', y='feature__sum_values', color='target') fig.show() ``` - 对于回归任务:绘制特征目标变量的散点图 ```python fig = px.scatter(extracted_features, x='feature__sum_values', y='target', trendline='ols') fig.show() ``` ### 6. **特征重要性评估** - **单变量特征选择**:使用统计检验方法(如ANOVA F值、卡方检验)评估每个特征目标变量的关系强度。 ```python from sklearn.feature_selection import SelectKBest, f_classif selector = SelectKBest(f_classif, k=10) X_new = selector.fit_transform(extracted_features, target) ``` - **基于模型的特征重要性**:使用随机森林或XGBoost等模型评估特征重要性。 ```python from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() model.fit(extracted_features, target) importance = pd.Series(model.feature_importances_, index=extracted_features.columns) ``` ### 7. **高维特征降维可视化** - **主成分分析(PCA)**:将特征投影到2D/3D空间观察聚类结构。 ```python from sklearn.decomposition import PCA pca = PCA(n_components=3) components = pca.fit_transform(extracted_features) fig = px.scatter_3d(components, x=0, y=1, z=2, color=target) fig.show() ``` - **t-SNE**:适合高维数据的非线性降维,但计算成本高。 ```python from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=30) tsne_results = tsne.fit_transform(extracted_features) fig = px.scatter(tsne_results, x=0, y=1, color=target) fig.show() ``` ### 8. **特征分组分析** - 将特征按提取方法分组(如统计特征、频谱特征、熵特征等): ```python # 示例:按特征名前缀分组 stat_features = [col for col in extracted_features.columns if col.startswith('feature__stat')] spectral_features = [col for col in extracted_features.columns if col.startswith('feature__fft')] ``` - 分析每组特征的整体表现: - 组内特征相关性 - 组特征目标变量的平均相关性 ### 9. **时间序列特征重建验证** - 选择关键特征重建原始时间序列: - 例如,使用均值、方差、趋势等特征重建近似序列 - 比较重建序列原始序列的差异,验证特征代表性。 ### 10. **特征稳定性分析** - 通过交叉验证检查特征重要性排序的稳定性: ```python from sklearn.model_selection import cross_val_score, StratifiedKFold cv = StratifiedKFold(n_splits=5) stability_scores = [] for train_index, test_index in cv.split(extracted_features, target): X_train, X_test = extracted_features.iloc[train_index], extracted_features.iloc[test_index] y_train, y_test = target[train_index], target[test_index] model.fit(X_train, y_train) # 计算特征重要性并记录 ``` ## 关键问题检查清单 1. **冗余特征**:是否存在高度线性相关的特征? 2. **无关特征**:是否存在方差接近于零的常数特征? 3. **异常特征**:是否存在极端离群值影响分布? 4. **特征解释性**:特征是否具有可解释的业务意义? 5. **计算效率**:特征数量是否过多导致计算效率低下? ## 手动分析示例代码 ```python # 假设 extracted_features 是tsfresh提取的特征矩阵,target是目标变量 # 步骤1:数据概览 print("特征矩阵维度:", extracted_features.shape) print("缺失值统计:\n", extracted_features.isnull().sum().sort_values(ascending=False).head(10)) # 步骤2:处理缺失值 from tsfresh.utilities.dataframe_functions import impute impute(extracted_features) # 步骤3:特征分布可视化(选择前5个特征) import plotly.express as px for feature in extracted_features.columns[:5]: fig = px.box(extracted_features, y=feature, title=f'{feature}的分布') fig.show() # 步骤4:特征相关性分析(仅计算前20个特征避免内存问题) corr_matrix = extracted_features.iloc[:, :20].corr() fig = px.imshow(corr_matrix, color_continuous_scale='RdBu_r', zmin=-1, zmax=1) fig.show() # 步骤5:特征目标变量关系(分类任务示例) if target is not None: for feature in extracted_features.columns[:5]: fig = px.violin(extracted_features, x=target, y=feature, box=True, points='all') fig.show() # 步骤6:特征重要性(随机森林) from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(extracted_features, target) importance = pd.Series(model.feature_importances_, index=extracted_features.columns) top_features = importance.sort_values(ascending=False).index[:10] # 步骤7:降维可视化(PCA) from sklearn.decomposition import PCA pca = PCA(n_components=3) components = pca.fit_transform(extracted_features) fig = px.scatter_3d(components, x=0, y=1, z=2, color=target) fig.show() ``` 通过以上系统化分析,您可以全面了解tsfresh特征矩阵的特性,为后续的特征选择和模型构建奠定基础[^1]。 §§相关问题§§ 1. 如何处理tsfresh特征矩阵中的高度相关特征? 2. 如何解释tsfresh生成的非线性特征(如近似熵)? 3. 在时间序列预测中,如何验证提取特征的有效性? 4. 如何优化tsfresh的特征提取参数以提高特征质量?</think>## 手动分析tsfresh时序特征矩阵的完整指南 分析tsfresh提取的时序特征矩阵是理解数据本质的关键步骤,以下是系统化的手动分析方法: ### 1. **初步数据探查** ```python # 查看特征矩阵基本信息 print(f"特征维度: {features.shape}") # (样本数, 特征数) print(f"特征类型分布:\n{features.dtypes.value_counts()}") # 统计描述 stats = features.describe().T stats['missing_%'] = (features.isnull().sum() / len(features)) * 100 print(stats[['mean', 'std', 'min', '50%', 'max', 'missing_%']]) ``` **关键分析点**: - 检查特征数量是否合理(通常$10^2-10^3$量级) - 识别缺失值比例 > 30% 的特征[^1] - 检测零方差特征:$\sigma = 0$ - 发现异常值:$|x - \mu| > 3\sigma$ ### 2. **分布特征分析** 使用箱线图和小提琴图联合分析: ```python import plotly.express as px fig = px.violin( features.melt(var_name='feature'), x='feature', y='value', box=True, title='特征值分布分析' ) fig.update_layout(xaxis_tickangle=45) fig.show() ``` **分析重点**: - 偏度:$ \text{skew} = \frac{E[(X-\mu)^3]}{\sigma^3} $ - $|\text{skew}| > 1$ 表示显著偏态 - 峰度:$ \text{kurtosis} = \frac{E[(X-\mu)^4]}{\sigma^4} $ - $\text{kurtosis} > 3$ 表示尖峰分布 - 多峰分布暗示潜在子模式 ### 3. **相关性结构分析** ```python # 计算并排序相关性 corr = features.corr().abs() mean_corr = corr.mean().sort_values(ascending=False) # 聚类相关矩阵 from scipy.cluster import hierarchy linkage = hierarchy.linkage(corr, method='average') order = hierarchy.dendrogram(linkage, no_plot=True)['leaves'] sorted_corr = corr.iloc[order, order] # 可视化 fig = px.imshow( sorted_corr, color_continuous_scale='RdBu_r', zmin=-1, zmax=1, title='特征相关性聚类热力图' ) fig.show() ``` **分析策略**: 1. 识别高相关组($|\rho| > 0.8$) 2. 每组选代表特征:选择目标变量相关性最高者 3. 分析负相关特征对:$ \rho < -0.7 $ ### 4. **特征分组分析** 按特征类型分组: ```python # 创建特征类别映射 feature_types = { '统计特征': [f for f in features if '__sum' in f or '__mean' in f], '熵特征': [f for f in features if '__entropy' in f], '频谱特征': [f for f in features if '__fft' in f], '自相关特征': [f for f in features if '__autocorrelation' in f] } # 分析组内特性 for type_name, type_features in feature_types.items(): group = features[type_features] print(f"\n{type_name}组 (共{len(type_features)}个特征):") print(f"• 平均相关性: {group.corr().abs().mean().mean():.3f}") print(f"• 特征值范围: [{group.min().min():.3f}, {group.max().max():.3f}]") ``` ### 5. **时间序列重建验证** ```python import numpy as np import plotly.graph_objects as go # 选择关键特征重建序列 key_features = ['value__sum_values', 'value__autocorrelation__lag_1', 'value__c3__lag_3'] fig = go.Figure() for i, feat in enumerate(key_features): # 简化重建逻辑(实际需更复杂模型) reconstructed = np.cumsum(features[feat].sample(50)) fig.add_trace(go.Scatter( y=reconstructed, name=f"重建自: {feat}", line=dict(dash='dash' if i>0 else 'solid') )) fig.update_layout(title="基于关键特征的时间序列重建") fig.show() ``` **验证要点**: - 比较重建序列原始序列的形态相似性 - 评估特征捕捉的关键模式:趋势/周期/突变点 - 检查$ \text{MSE} = \frac{1}{n}\sum(y-\hat{y})^2 $ 量化重建误差 ### 6. **特征-目标关系分析** 若有目标变量,使用散点矩阵分析: ```python fig = px.scatter_matrix( features.sample(500).join(target), dimensions=key_features + ['target'], color='target', title="特征-目标关系矩阵" ) fig.update_traces(diagonal_visible=False) fig.show() ``` **分析方法**: - 线性关系:$ \frac{\partial \text{target}}{\partial \text{feature}} \approx \text{const} $ - 非线性模式:U型/倒U型关系 - 交互作用:$ f(x1,x2) \neq f(x1) + f(x2) $ ### 7. 专家知识引导分析 结合领域知识深度解读: ```python # 示例:金融时序特征分析 financial_heuristics = { '波动率特征': [ 'value__variance', 'value__standard_deviation', 'value__variation_coefficient' ], '趋势特征': [ 'value__linear_trend__attr_"slope"', 'value__mean_abs_change' ], '周期特征': [ 'value__fft_aggregated__aggtype_"centroid"', 'value__autocorrelation__lag_24' # 日周期特征 ] } ``` **分析维度**: - 物理意义:特征是否对应实际系统参数? - 可解释性:$\frac{\partial \text{特征}}{\partial \text{输入}}$是否明确? - 鲁棒性:在数据扰动下特征值是否稳定? ## 分析报告关键结论 1. **特征质量评估**: - 高价值特征:高方差、低缺失、强目标关联 - 低价值特征:零方差、高缺失、高相关冗余 2. **降维策略建议**: $$ \text{PCA} \rightarrow \text{保留90%方差所需维度} $$ $$ \text{特征重要性} \rightarrow \text{基于树模型的重要性排序} $$ 3. **异常特征处理**: - 删除:缺失率 > 30% 或 零方差 - 转换:$\log(x+c)$ 处理右偏特征 - 分箱:非线性关系特征离散化 通过这7步分析,您将全面掌握特征矩阵的特性,为后续建模奠定坚实基础[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值