修改训练模型参数,适配巡飞弹的新增特征参数
This commit is contained in:
parent
f8c1ed7560
commit
dd3664f6c7
@ -116,7 +116,7 @@ if (typeof response.data.custom_params === 'string') {
|
|||||||
|
|
||||||
4. 调试方法
|
4. 调试方法
|
||||||
|
|
||||||
- 使用日志跟踪数据流
|
- 使用日志<EFBFBD><EFBFBD><EFBFBD>踪数据流
|
||||||
- 检查数据格式和类型
|
- 检查数据格式和类型
|
||||||
- 验证每个环节的数据
|
- 验证每个环节的数据
|
||||||
|
|
||||||
@ -300,7 +300,7 @@ if (correlationChart.value) {
|
|||||||
|
|
||||||
3. 数据格式问题
|
3. 数据格式问题
|
||||||
|
|
||||||
- 特征名称需要中文映射
|
- 特征名称需<EFBFBD><EFBFBD>中文映射
|
||||||
- 相关性数据需要保留2位小数
|
- 相关性数据需要保留2位小数
|
||||||
- 需要正确处理缺失值
|
- 需要正确处理缺失值
|
||||||
|
|
||||||
@ -373,7 +373,7 @@ correlation_data.append([
|
|||||||
|
|
||||||
### 问题描述
|
### 问题描述
|
||||||
|
|
||||||
特征分析<EFBFBD><EFBFBD><EFBFBD>面切换到其他页面后再返回,页面状态(分析结果和图表)会丢失,需要重新分析。
|
特征分析页面切换到其他页面后<EFBFBD><EFBFBD><EFBFBD>返回,页面状态(分析结果和图表)会丢失,需要重新分析。
|
||||||
|
|
||||||
### 调试步骤
|
### 调试步骤
|
||||||
|
|
||||||
@ -446,7 +446,7 @@ const __name = 'AnalysisPage'
|
|||||||
|
|
||||||
- 使用 Vue3 的新 API
|
- 使用 Vue3 的新 API
|
||||||
- 保持配置简单清晰
|
- 保持配置简单清晰
|
||||||
- 避免不必要的限制
|
- 避免不<EFBFBD><EFBFBD><EFBFBD>要的限制
|
||||||
|
|
||||||
2. 组件定义
|
2. 组件定义
|
||||||
|
|
||||||
@ -651,3 +651,145 @@ trainingResult.value = null
|
|||||||
- 增加了数据验证步骤
|
- 增加了数据验证步骤
|
||||||
- 处理了可能的NaN值
|
- 处理了可能的NaN值
|
||||||
- 确保所有数值都转换为Python原生类型(使用float())
|
- 确保所有数值都转换为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)
|
logger.error(f"Detailed traceback:", exc_info=True)
|
||||||
return False
|
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):
|
def predict(self, features):
|
||||||
"""
|
"""使用加载的模型进行预测"""
|
||||||
使用加载的模型进行预测
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
if not self.best_model:
|
if not self.best_model:
|
||||||
raise ValueError("No model loaded")
|
raise ValueError("No model loaded")
|
||||||
@ -454,6 +474,18 @@ class ModelTrainer:
|
|||||||
logger.info(f"Input features shape: {features.shape}")
|
logger.info(f"Input features shape: {features.shape}")
|
||||||
logger.info(f"Input features: \n{features}")
|
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.array(features, dtype=float)
|
||||||
features_filled[np.isnan(features_filled)] = 0
|
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 shape: {y_pred_scaled.shape}")
|
||||||
logger.info(f"Scaled prediction: {y_pred_scaled}")
|
logger.info(f"Scaled prediction: {y_pred_scaled}")
|
||||||
|
|
||||||
# <EFBFBD><EFBFBD>标准化
|
# 反标准化
|
||||||
y_pred = self.target_scaler.inverse_transform(y_pred_scaled.reshape(-1, 1))
|
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 shape: {y_pred.shape}")
|
||||||
logger.info(f"Final prediction: {y_pred}")
|
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()
|
return y_pred.ravel()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -496,10 +523,32 @@ class ModelTrainer:
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
# 获取特征名称
|
# 获取特征名称
|
||||||
|
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_analyzer = FeatureAnalysis()
|
||||||
feature_names = feature_analyzer.get_equipment_specific_features(self.equipment_type)
|
feature_names = feature_analyzer.get_equipment_specific_features(self.equipment_type)
|
||||||
|
|
||||||
# 获取特<E58F96><E789B9><EFBFBD>重要性
|
# 获取特征重要性
|
||||||
if hasattr(model, 'feature_importances_'):
|
if hasattr(model, 'feature_importances_'):
|
||||||
importances = model.feature_importances_
|
importances = model.feature_importances_
|
||||||
elif hasattr(model, 'coef_'):
|
elif hasattr(model, 'coef_'):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user