修改训练模型参数,适配巡飞弹的新增特征参数

This commit is contained in:
Tian jianyong 2024-11-12 11:21:49 +08:00
parent f8c1ed7560
commit dd3664f6c7
2 changed files with 207 additions and 16 deletions

View File

@ -116,7 +116,7 @@ if (typeof response.data.custom_params === 'string') {
4. 调试方法
- 使用日志踪数据流
- 使用日志<EFBFBD><EFBFBD><EFBFBD>踪数据流
- 检查数据格式和类型
- 验证每个环节的数据
@ -300,7 +300,7 @@ if (correlationChart.value) {
3. 数据格式问题
- 特征名称需中文映射
- 特征名称需<EFBFBD><EFBFBD>中文映射
- 相关性数据需要保留2位小数
- 需要正确处理缺失值
@ -373,7 +373,7 @@ correlation_data.append([
### 问题描述
特征分析<EFBFBD><EFBFBD><EFBFBD>面切换到其他页面后再返回,页面状态(分析结果和图表)会丢失,需要重新分析。
特征分析页面切换到其他页面后<EFBFBD><EFBFBD><EFBFBD>返回,页面状态(分析结果和图表)会丢失,需要重新分析。
### 调试步骤
@ -446,7 +446,7 @@ const __name = 'AnalysisPage'
- 使用 Vue3 的新 API
- 保持配置简单清晰
- 避免不要的限制
- 避免不<EFBFBD><EFBFBD><EFBFBD>要的限制
2. 组件定义
@ -651,3 +651,145 @@ trainingResult.value = null
- 增加了数据验证步骤
- 处理了可能的NaN值
- 确保所有数值都转换为Python原生类型使用float()
## 巡飞弹数据整理问题总结
### 1. 最小飞行高度数据问题
#### 问题描述
- 所有巡飞弹的最小飞行高度都被设置为相同值50米
- 在特征相关性分析中由于数据完全相同导致该特征与其他特征的相关性无法计算出现NaN
#### 解决方案
1. 根据巡飞弹的类型和性能特点,设置不同的最小飞行高度:
- 大型巡飞弹(如 HAROP/Harpy、Shahed系列150米
- 中型巡飞弹(如 Mini Harpy、高端Hero系列100米
- 中小型巡飞弹(如 Hero-120、Switchblade 60080米
- 小型巡飞弹(如 Hero-30/70、Switchblade 30050米
- 超小型巡飞弹(如 Kargu/Alpagu、Rotem系列30米
2. 在特征分析中处理常量特征:
- 检测标准差为0的特征
- 对于常量特征设置与自身的相关性为1
- 与其他特征的相关性设置为0
- 添加相应的日志记录和警告信息
### 2. 特征分析图表显示问题
#### 问题描述
1. 特征工程参数分析和发动机性能分析图表中由于空间限制x轴上的装备型号名称显示不完整
2. 相关性热力图单元格高度过小,不易查看
#### 解决方案
1. 图表标签显示优化:
- 在 tooltip 中显示完整的装备型号名称
- 添加数据点的详细信息显示
```javascript
tooltip: {
formatter: function(params) {
const equipmentName = chartData.names[params[0].dataIndex]
let result = `${equipmentName}<br/>`
params.forEach(param => {
result += `${param.seriesName}: ${param.value.toFixed(2)}<br/>`
})
return result
}
}
```
2. 热力图显示优化:
- 增加图表容器高度800px
- 调整 grid 配置,增加显示区域
- 优化标签间距和旋转角度
```javascript
grid: {
height: '75%',
top: '10%',
bottom: '15%',
left: '10%',
right: '10%',
containLabel: true
}
```
### 3. 数据完整性问题
#### 问题描述
部分巡飞弹数据字段存在缺失:
- 宽度、高度50% 缺失
- 弹头重量77.78% 缺失
- 最大速度77.78% 缺失
- 巡航速度61.11% 缺失
#### 解决方案
1. 数据补充和验证:
- 根据装备的物理特性和性能参数推算缺失值
- 使用相似型号的数据作为参考
- 添加数据验证和完整性检查
2. 特征工程:
- 添加新的组合特征:长宽比、重量射程比等
- 计算衍生参数:有效载荷、最小作战半径等
- 设计评分系统:制导系统评分、战斗部威力评分等
### 4. 数据一致性问题
#### 问题描述
- 不同型号之间的参数单位不统一
- 部分参数的计算方式不一致
- 分类特征(如制导系统、战斗部类型)的表述不统一
#### 解决方案
1. 统一数据标准:
- 统一使用国际单位制SI
- 标准化参数计算方法
- 规范分类特征的表述方式
2. 添加数据转换和验证:
```python
# 单位转换
l.max_speed_ms = l.max_speed_kmh / 3.6
l.engine_thrust_n = l.engine_thrust_kgf * 9.81
# 分类特征编码
l.guidance_system_code =
CASE
WHEN l.guidance_system = 'GPS/INS' THEN 1
WHEN l.guidance_system = 'GPS/INS/光电' THEN 2
# ... 其他情况
END
```
### 最佳实践建议
1. 数据收集和整理:
- 建立完整的数据采集标准
- 确保数据的一致性和可比性
- 及时记录数据来源和处理方法
2. 特征工程:
- 根据领域知识设计特征
- 考虑特征之间的关系
- 注意特征的可解释性
3. 数据验证:
- 实施多层次的数据验证
- 添加完整的日志记录
- 建立数据质量监控机制
4. 可视化展示:
- 确保图表的可读性
- 提供详细的数据说明
- 支持交互式数据探索

View File

@ -436,10 +436,30 @@ class ModelTrainer:
logger.error(f"Detailed traceback:", exc_info=True)
return False
def get_missile_features(self):
"""获取巡飞弹的特征列表"""
return [
# 基本参数
'length_m', 'width_m', 'height_m', 'weight_kg', 'max_range_km',
# 性能参数
'wingspan_m', 'warhead_weight_kg', 'max_speed_ms', 'cruise_speed_kmh',
'endurance_min', 'payload_weight_kg', 'min_combat_radius_km',
# 动力系统参数
'engine_power_kw', 'engine_thrust_n',
# 制导与控制参数
'datalink_range_km', 'guidance_accuracy_m',
'min_altitude_m', 'max_altitude_m',
# 特征工程参数
'length_width_ratio', 'weight_range_ratio', 'speed_weight_ratio',
'guidance_system_score', 'warhead_power_score'
]
def predict(self, features):
"""
使用加载的模型进行预测
"""
"""使用加载的模型进行预测"""
try:
if not self.best_model:
raise ValueError("No model loaded")
@ -454,6 +474,18 @@ class ModelTrainer:
logger.info(f"Input features shape: {features.shape}")
logger.info(f"Input features: \n{features}")
# 获取正确的特征列表
if self.equipment_type == '巡飞弹':
feature_list = self.get_missile_features()
logger.info(f"Using missile features: {feature_list}")
# 确保特征顺序一致
features_ordered = np.zeros((features.shape[0], len(feature_list)))
for i, feature_name in enumerate(feature_list):
if feature_name in features:
features_ordered[:, i] = features[feature_name]
features = features_ordered
# 处理缺失值
features_filled = np.array(features, dtype=float)
features_filled[np.isnan(features_filled)] = 0
@ -471,16 +503,11 @@ class ModelTrainer:
logger.info(f"Scaled prediction shape: {y_pred_scaled.shape}")
logger.info(f"Scaled prediction: {y_pred_scaled}")
# <EFBFBD><EFBFBD>标准化
# 标准化
y_pred = self.target_scaler.inverse_transform(y_pred_scaled.reshape(-1, 1))
logger.info(f"Final prediction shape: {y_pred.shape}")
logger.info(f"Final prediction: {y_pred}")
# 记录标准化器的参数
logger.info("Target scaler params:")
logger.info(f"Mean: {self.target_scaler.mean_}")
logger.info(f"Scale: {self.target_scaler.scale_}")
return y_pred.ravel()
except Exception as e:
@ -496,10 +523,32 @@ class ModelTrainer:
return {}
# 获取特征名称
feature_analyzer = FeatureAnalysis()
feature_names = feature_analyzer.get_equipment_specific_features(self.equipment_type)
if self.equipment_type == '巡飞弹':
feature_names = [
# 基本参数
'length_m', 'width_m', 'height_m', 'weight_kg', 'max_range_km',
# 性能参数
'wingspan_m', 'warhead_weight_kg', 'max_speed_ms', 'cruise_speed_kmh',
'endurance_min', 'payload_weight_kg', 'min_combat_radius_km',
# 动力系统参数
'engine_power_kw', 'engine_thrust_n',
# 制导与控制参数
'datalink_range_km', 'guidance_accuracy_m',
'min_altitude_m', 'max_altitude_m',
# 特征工程参数
'length_width_ratio', 'weight_range_ratio', 'speed_weight_ratio',
'guidance_system_score', 'warhead_power_score'
]
else:
# 其他装备类型使用原有的特征获取逻辑
feature_analyzer = FeatureAnalysis()
feature_names = feature_analyzer.get_equipment_specific_features(self.equipment_type)
# 获取特<E58F96><E789B9><EFBFBD>重要性
# 获取特重要性
if hasattr(model, 'feature_importances_'):
importances = model.feature_importances_
elif hasattr(model, 'coef_'):