Orange3数据可视化(箱线图-离散属性分布)

箱线图(Box Plot)

又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因图形如箱子,且在上下四分位数之外常有线条像胡须延伸出去而得名

箱线图可以显示属性值的分布,快速发现异常,例如重复的值,离群值等,挖掘数据的分布规律

输入
    数据:输入数据集 
输出
    选中的数据:从图中选中的实例 
    数据:带有额外一列,显示点是否被选中 

箱形图小部件显示属性值的分布。使用此小部件检查任何新数据是一个好习惯,
可以快速发现任何异常,例如重复值(例如,灰色和灰色的值)、异常值等。

箱型图的特征


1.直观地观察到异常值,如果数据存在离群点,即位于上下边缘区域之外,以圆点的形式表示
2.当箱型图很短时,意味着很多数据多集中分布在很小的范围内
3.当箱型图很长时,意味着数据分布比较离散,数据间的差异比较大
4.当中位数接近底部时,说明大部分的数据值比较小
5.当中位数接近顶部时,说明大部分的数据值比较大
6.中位数所处的高低位置能反映数据的偏斜程度
7.如果上下虚线比较长,说明上下四分位数之外的数据变化比较大,整体数据的方差和标准偏差也比较大
8.箱型图的上下边缘并非最大值或最小值

箱型图的缺点


1.箱型图虽然能显示出数据的分布偏态,但是不能提供关于数据分布偏态和尾重程度的精确度量;
2.对于批量较大的数据批,箱线图反映的形状信息更加模糊;
3.用中位数代表总体平均水平有一定的局限性。
所以,应用箱线图最好结合其它描述统计工具如均值、标准差、偏度、分布函数等来描述数据批的分布形状。

详细说明

  • 选择要绘制的变量。勾选“按与子组的相关性排序”以根据所选子组的Chi2或ANOVA对变量进行排序。

  • 选择“子组”以查看由离散子组显示的箱线图。勾选“按与变量的相关性排序”以根据所选变量的Chi2或ANOVA对子组进行排序。

  • 当实例按子组分组时,您可以更改显示模式。带注释的框将显示端值、平均值和中位数,而比较中位数和比较平均值将自然而然地在子组之间比较所选值。

  • 平均值(深蓝色垂直线)。细蓝色线代表标准差。

  • 第一个(25%)和第三个(75%)四分位数的值。蓝色高亮区域表示第一个和第三个四分位数之间的值。

  • 中位数(黄色垂直线)。

对于离散属性,条形图代表每个特定属性值的实例数量。该图显示了动物园数据集中不同动物类型的数量:有41种哺乳动物,13种鱼,20种鸟类等。

显示选项:

  • 拉伸条形:显示数据实例的相对值(比例)。未勾选的框显示绝对值。
  • 显示框标签:在每个条形图上方显示离散值。
  • 按子组频率排序:按降序对子组进行排序。

示例

软件下载链接: https://pan.baidu.com/s/12drK7Mz7YSqrwIQk5Wh5cw?pwd=8tnd 

视频教程:关注我不迷路, 抖音:Orange3dev


https://www.douyin.com/user/MS4wLjABAAAAicBGZTE2kX2EVHJPe8Ugk3_nlJk9Nha8OZh4Bo_nTu8

1-组件概览
2-树查看器-决策树
3-箱线图-离散属性分布
4-箱线图-要素计算
5-箱线图-连续属性分布
6-小提琴图
7-分布图
8-散点图-智能数据可视化
9-散点图-探索性数据分析
10-散点图-高亮选择数据
11-折线图
12-条形图
13-筛网图
14-马赛克图
15-自由投影
16-线性投影
17-雷达图
18-热力图
19-韦恩图
20-轮廓图
21-毕达哥拉斯树
22-毕达哥拉斯森林
23-CN2规则查看器
24-诺莫图
 

import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from pathlib import Path excel_path = "C:/Users/Administrator/Desktop/data2.xlsx" data = pd.read_excel(excel_path, sheet_name='Sheet1') x = data[['掺氨比', '总热输入', '分级比', '主燃区温度']] y = data['NOx排放浓度'] cat_cols = data.select_dtypes(include=['object']).columns for col in cat_cols: data[col] = le.fit_transform(data[col]) X = data.drop('NOx排放浓度', axis=1) y = data['NOx排放浓度'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) import xgboost as xgb dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) params = { 'objective': 'reg:squarederror', 'eval_metric': 'rmse', 'eta': 0.1, 'max_depth': 6, 'subsample': 0.8, 'colsample_bytree': 0.8 } model = xgb.train(params, dtrain, num_boost_round=100, evals=[(dtrain, 'train'), (dtest, 'test')], early_stopping_rounds=10) y_pred = model.predict(dtest) from sklearn.metrics import mean_squared_error, r2_score from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split print(f"MSE: {mean_squared_error(y_test, y_pred):.2f}") print(f"RMSE: {mean_squared_error(y_test, y_pred, squared=False):.2f}") print(f"R²: {r2_score(y_test, y_pred):.2%}") import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体 plt.rcParams['axes.unicode_minus'] = False xgb.plot_importance(model) plt.show() 评估结果不好
03-08
<think>嗯,用户给了一段代码,是关于使用XGBoost回归模型预测NOx排放浓度的,但评估结果不好,比如MSE、RMSE和R²分数不理想。用户希望我分析原因并提出改进方法。首先,我需要仔细看看代码有没有什么问题。 首先看数据导入部分,用户用了pandas读取Excel,正确。然后定义了特征x和目标y,但之后又处理了分类列,可能数据里有类别变量?不过原来的x里并没有包含这些分类列,因为后面又用X = data.drop(&#39;NOx排放浓度&#39;, axis=1),这时候可能包含了之前处理过的分类列。这里可能存在一个问题:是否在特征工程中正确处理了分类变量? 接下来,LabelEncoder被应用到了所有object类型的列,但用户可能在数据中存在其他分类特征未被正确编码的情况。或者,可能在特征选择的时候有没有遗漏重要的变量? 然后,数据分割用了train_test_split,参数没问题。XGBoost的参数设置方面,objective是回归,eval_metric是RMSE,参数如eta、max_depth等看起来常规。可能模型参数需要调整,或者数据量不够,导致过拟合或欠拟合? 模型训练部分用了early_stopping,观察验证集的性能,这可以防止过拟合。但结果不好可能说明模型没有学习到足够的模式。可能特征不够相关,或者数据预处理有问题,比如是否需要标准化或归一化?XGBoost通常对特征缩放不敏感,但其他处理比如缺失值处理呢?数据里是否有缺失值?用户代码中没有处理缺失值的步骤,可能数据中存在NaN值,影响模型表现。 另外,特征选择方面,用户最初选取的四个特征是否足够?是否遗漏了其他重要特征?或者这些特征与目标的相关性不高?可能需要做特征相关性分析,比如计算相关系数矩阵,或者通过其他特征重要性方法筛选。 评估指标方面,用户计算了MSE、RMSE和R²,R²低说明模型解释力不足。这时候可能需要更多的特征,或者更复杂的模型,或者数据本身噪音太大,无法有效预测。 还有,数据量的问题。如果样本量太少,模型难以学习到规律,尤其是XGBoost这种需要足够数据量的模型。用户的数据量是否足够?比如,data2.xlsx里的样本数是多少?如果只有几十条,可能效果不好。 另外,可能模型超参数需要调优。虽然用户设定了eta、max_depth等,但可能没有找到最佳组合。建议使用网格搜索或随机搜索进行参数调优,比如调整max_depth、subsample、colsample_bytree、learning_rate等,或者增加n_estimators(num_boost_round)。 还有可能数据存在非线性关系,XGBoost本身可以处理,但可能需要更深的树或者不同的参数设置。或者,尝试其他模型,比如随机森林、梯度提升树等,比较结果。 另外,检查是否有异常值影响模型。NOx排放浓度是否有极端值?可以通过箱线图查看,或者对目标变量进行变换,比如对数变换,使其分布更接近正态,可能提升模型效果。 特征工程方面,是否可以考虑交互项、多项式特征?比如将某些特征相乘或平方,增加模型的表达能力。或者进行分箱处理,将连续变量离散化。 最后,可视化部分,用户画了特征重要性图,可能发现某些特征的重要性较低,这时候可以考虑移除不重要特征,减少过拟合风险,或者进一步分析这些特征是否有意义。 总结下来,可能的问题包括数据预处理不充分、特征选择不当、模型参数未调优、数据量不足、异常值存在等。需要逐一排查,并进行相应的改进。</think>以下是对该机器学习流程的分析和改进建议,按步骤说明: $$代码分析流程图$$ 1. 数据读取 → 2. 特征工程 → 3. 数据分割 → 4. 模型训练 → 5. 模型评估 $\boxed{问题诊断}$ 1. $\color{red}{数据泄露}$:LabelEncoder在循环外使用fit_transform,应在循环内对每个分类列单独处理 2. $\color{red}{特征矛盾}$:x初始定义为4个特征,但后续X使用data.drop()会包含所有特征 3. $\color{orange}{参数未优化}$:XGBoost默认参数可能不适合当前数据集 4. $\color{orange}{特征工程缺失}$:未处理异常值、未标准化连续变量 $\boxed{改进方案}$ 1. $\textcircled{1}$ 数据预处理修正: ```python # 修正后的LabelEncoder应用 le = LabelEncoder() for col in cat_cols: data[col] = le.fit_transform(data[col].astype(str)) # 确保处理字符串类型 # 添加标准化(对连续变量) from sklearn.preprocessing import StandardScaler num_cols = [&#39;掺氨比&#39;, &#39;总热输入&#39;, &#39;分级比&#39;, &#39;主燃区温度&#39;] scaler = StandardScaler() data[num_cols] = scaler.fit_transform(data[num_cols]) ``` 2. $\textcircled{2}$ 特征工程增强: ```python # 添加交互特征示例 data[&#39;热输入_温度&#39;] = data[&#39;总热输入&#39;] * data[&#39;主燃区温度&#39;] # 异常值处理(使用IQR方法) Q1 = data[&#39;NOx排放浓度&#39;].quantile(0.25) Q3 = data[&#39;NOx排放浓度&#39;].quantile(0.75) IQR = Q3 - Q1 data = data[~((data[&#39;NOx排放浓度&#39;] < (Q1 - 1.5*IQR)) | (data[&#39;NOx排放浓度&#39;] > (Q3 + 1.5*IQR)))] ``` 3. $\textcircled{3}$ 参数优化: ```python # 使用网格搜索优化参数 from sklearn.model_selection import GridSearchCV param_grid = { &#39;max_depth&#39;: [4, 6, 8], &#39;learning_rate&#39;: [0.01, 0.1, 0.2], &#39;subsample&#39;: [0.6, 0.8, 1.0], &#39;colsample_bytree&#39;: [0.6, 0.8, 1.0] } xgb_reg = xgb.XGBRegressor(objective=&#39;reg:squarederror&#39;) grid_search = GridSearchCV(estimator=xgb_reg, param_grid=param_grid, scoring=&#39;neg_mean_squared_error&#39;, cv=5) grid_search.fit(X_train, y_train) best_params = grid_search.best_params_ ``` $\boxed{评估指标提升策略}$ 1. $\sqrt{交叉验证}$:使用5折交叉验证代替单一划分 2. $\mathbb{E}[R^2]$提升:尝试特征选择方法 ```python from sklearn.feature_selection import RFE # 递归特征消除 selector = RFE(estimator=xgb.XGBRegressor(), n_features_to_select=6, step=1) selector = selector.fit(X_train, y_train) selected_features = X.columns[selector.support_] ``` 3. $\lambda$正则化:在XGBoost参数中添加正则项 ```python params.update({ &#39;lambda&#39;: 0.1, # L2正则化 &#39;alpha&#39;: 0.01, # L1正则化 &#39;min_child_weight&#39;: 5 }) ``` $\boxed{可视化改进}$ 建议添加预测值与真实值的散点图,直观显示拟合效果: ```python plt.figure(figsize=(10,6)) plt.scatter(y_test, y_pred, alpha=0.6) plt.plot([y.min(), y.max()], [y.min(), y.max()], &#39;k--&#39;, lw=2) plt.xlabel("真实值") plt.ylabel("预测值") plt.title("预测值 vs 真实值") plt.grid(True) plt.show() ``` $\boxed{终极解决方案}$ 若上述改进仍不理想,可尝试: 1. 使用深度学习方法构建全连接神经网络 2. 集成多个模型(XGBoost + LightGBM + CatBoost) 3. 应用贝叶斯优化进行超参数搜索 4. 使用SHAP值进行可解释性分析,辅助特征工程 建议优先检查数据质量(缺失值、异常值、特征相关性),再优化模型参数,最后考虑模型复杂度升级。可通过以下命令快速检查数据基本信息: ```python print(data.info()) print(data.describe()) data.hist(figsize=(12,10)) plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值