修改训练模型参数,适配巡飞弹的新增特征参数
This commit is contained in:
parent
f8c1ed7560
commit
dd3664f6c7
@ -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 600):80米
|
||||
- 小型巡飞弹(如 Hero-30/70、Switchblade 300):50米
|
||||
- 超小型巡飞弹(如 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. 可视化展示:
|
||||
- 确保图表的可读性
|
||||
- 提供详细的数据说明
|
||||
- 支持交互式数据探索
|
||||
|
||||
@ -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_'):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user