问题

新手如何实现个简单AutoML框架。有参考的github开源项目介绍吗?

回答
作为一名新手,想自己捣鼓出一个简单易用的AutoML框架,这想法很棒!这不仅仅是了解AutoML的工作原理,更是对整个机器学习流程的一次深度实践。别担心,我来帮你一步步拆解,让你能动手做出自己的小玩意儿。

什么是AutoML?打个比方你就懂了

想象一下,你有一个食材库(你的数据集),你想做一道美味的菜(训练一个模型)。以前,你得自己选菜谱(模型架构),自己调味(超参数调整),自己烹饪(训练过程)。AutoML就像是一个超级大厨,它能帮你自动完成这些步骤。

选菜谱(模型选择): 有很多菜谱(不同的机器学习算法,比如线性回归、决策树、神经网络),AutoML会帮你挑一个最合适的。
调味(超参数调整): 就像你做菜要加多少盐、多少糖一样,模型也有很多参数需要调整,AutoML会自动帮你找到最佳的“调味料”。
烹饪(模型训练): AutoML还会帮你控制火候、时间,确保菜能做得好吃(模型训练得好)。
摆盘(模型评估): 最后,它还会告诉你这道菜味道怎么样,有没有什么需要改进的地方。

构建一个简单的AutoML框架,你需要哪些“核心组件”?

一个基础的AutoML框架,通常包含以下几个关键部分:

1. 数据预处理模块 (Data Preprocessing):
做什么? 机器学习模型可不认识生的数据。你需要把数据清洗干净,处理缺失值,转换格式,可能还需要特征缩放(比如把不同量级的特征拉到同一个范围)。
新手怎么做? 可以从最基础的处理开始,比如:
缺失值填充: 用均值、中位数、众数或者一个固定值来填充。
类别特征编码: 把文本类的标签(如“男”、“女”)转换成数字(如0、1)。
特征缩放: 使用 `StandardScaler` (标准化) 或 `MinMaxScaler` (归一化)。
考虑: 刚开始不必追求太复杂的预处理,先保证能跑起来。

2. 模型搜索模块 (Model Search / Architecture Search):
做什么? 这是一个AutoML的核心。它需要从一系列预设的模型(或者更进一步,自动设计模型结构)中选择一个,或者组合多个模型。
新手怎么做?
算法选择: 准备一个模型池,比如 `scikitlearn` 里的 `LogisticRegression`, `SVC`, `RandomForestClassifier`, `GradientBoostingClassifier`。
简单的搜索策略:
网格搜索 (Grid Search): 尝遍所有可能的模型组合和参数。虽然简单,但计算量大。
随机搜索 (Random Search): 比网格搜索更有效率,随机尝试模型和参数组合。
贝叶斯优化 (Bayesian Optimization): 更智能,根据之前的尝试结果,预测哪些参数组合可能表现更好。这个稍微高级一点,但网上有很多库可以帮你实现,比如 `scikitoptimize`。
考虑: 你的框架可以先支持固定的一组模型,然后逐步加入更复杂的搜索算法。

3. 超参数优化模块 (Hyperparameter Optimization HPO):
做什么? 即使选定了模型,模型的“性能”也很大程度上取决于它的超参数。比如,随机森林的树的数量、深度;支持向量机的 `C` 值和 `gamma` 值。HPO就是用来找到这些最佳参数的。
新手怎么做?
定义参数空间: 明确你要优化的模型有哪些超参数,以及它们的取值范围(是离散值还是连续值)。
使用搜索算法:
网格搜索/随机搜索: 同样适用于超参数优化。
更高级的: 贝叶斯优化、遗传算法 (Genetic Algorithms) 也是常见的选择。
考虑: HPO通常和模型搜索结合在一起。你可以在搜索不同模型的同时,也对每个模型进行超参数优化。

4. 模型评估模块 (Model Evaluation):
做什么? 怎么知道哪个模型、哪个参数组合“好”?你需要一套评价标准,比如准确率 (Accuracy)、F1分数 (F1Score)、AUC等。
新手怎么做?
交叉验证 (CrossValidation): 这是评估模型鲁棒性的标准方法,避免模型只在某个特定训练集上表现好。K折交叉验证 (KFold CrossValidation) 是最常用的。
选择合适的指标: 根据你的任务(分类、回归)选择合适的评估指标。
考虑: 确保你的评估过程是公平的,不要让模型在测试集上“偷看”。

5. 结果汇总与报告模块 (Result Aggregation & Reporting):
做什么? 收集所有尝试过的模型和参数组合的表现,找出最优的那个,并生成一份报告。
新手怎么做?
记录: 用一个字典或者列表记录每次尝试的模型、参数、评估指标。
排序: 根据评估指标对结果进行排序,找出最佳模型。
输出: 打印出最佳模型、最佳参数以及它的评估结果。
考虑: 刚开始可以简单地打印出来,之后可以考虑生成更友好的报告,比如HTML格式。

动手实践:用Python构建你的第一个AutoML框架

有了上面这些组件的概念,我们就可以用Python代码把它们串起来了。我这里给你一个非常基础的框架结构,你可以基于此进行扩展。

```python
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
import numpy as np

class SimpleAutoML:
def __init__(self, estimators, cv=5, scoring='accuracy'):
"""
:param estimators: 包含模型名称和模型的字典,例如 {'lr': LogisticRegression(), 'rf': RandomForestClassifier()}
:param cv: 交叉验证的折数
:param scoring: 评估指标
"""
self.estimators = estimators
self.cv = cv
self.scoring = scoring
self.best_model_ = None
self.best_params_ = None
self.results_ = {}

def _build_pipeline(self, model, params_grid):
"""
构建一个通用的数据预处理和模型训练的Pipeline
"""
假设我们只有数值型特征和类别型特征
你需要根据你的数据定义这些
numeric_features = model.get_params().get('numeric_features', []) 假设模型有指定numeric_features
categorical_features = model.get_params().get('categorical_features', []) 假设模型有指定categorical_features

数值特征处理:填充缺失值(用中位数)+ 标准化
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])

类别特征处理:填充缺失值(用常数)+ OneHot编码
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])

合并预处理步骤
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
],
remainder='passthrough' 保留未指定的列
)

创建最终的pipeline,包含预处理和模型
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', model)])
return pipeline

def fit(self, X, y):
"""
训练并评估所有模型,找到最优模型
"""
假设X是DataFrame,可以自动识别特征类型
if isinstance(X, pd.DataFrame):
numeric_features = X.select_dtypes(include=np.number).columns.tolist()
categorical_features = X.select_dtypes(exclude=np.number).columns.tolist()
else: 如果是numpy array,需要用户指定
print("Warning: Input X is not a pandas DataFrame. You might need to specify numeric_features and categorical_features manually.")
numeric_features = []
categorical_features = []

for name, estimator in self.estimators.items():
print(f" Training and evaluating {name} ")

为当前模型设置特征信息(如果模型需要)
if hasattr(estimator, 'set_params'):
try:
estimator.set_params(numeric_features=numeric_features, categorical_features=categorical_features)
except ValueError:
如果模型不支持直接设置,我们可以在_build_pipeline里处理
pass

定义超参数搜索空间
这里只是示例,你需要为每个模型定义合理的超参数范围
param_grid = {}
if name == 'lr':
param_grid = {
'classifier__C': [0.01, 0.1, 1, 10, 100],
'classifier__solver': ['liblinear', 'lbfgs']
}
elif name == 'rf':
param_grid = {
'classifier__n_estimators': [50, 100, 200],
'classifier__max_depth': [None, 10, 20, 30],
'classifier__min_samples_split': [2, 5, 10]
}
elif name == 'svc':
param_grid = {
'classifier__C': [0.1, 1, 10],
'classifier__kernel': ['rbf', 'linear'],
'classifier__gamma': ['scale', 'auto']
}
else:
print(f"No specific param_grid defined for {name}, using default.")


pipeline = self._build_pipeline(estimator, param_grid)

使用RandomizedSearchCV进行超参数搜索
n_iter 参数控制搜索的次数,可以根据计算资源调整
random_state 保证结果的可复现性
search = RandomizedSearchCV(pipeline,
param_grid,
n_iter=20, 尝试20种不同的超参数组合
cv=self.cv,
scoring=self.scoring,
random_state=42,
n_jobs=1) 使用所有CPU核心

search.fit(X, y)

self.results_[name] = {
'best_score': search.best_score_,
'best_params': search.best_params_,
'mean_test_score': search.cv_results_['mean_test_score'],
'params': search.cv_results_['params']
}
print(f" Best {self.scoring} for {name}: {search.best_score_:.4f}")
print(f" Best params: {search.best_params_}")

找到所有模型中最好的那个
best_model_name = max(self.results_, key=lambda k: self.results_[k]['best_score'])
self.best_model_ = self.estimators[best_model_name]
self.best_params_ = self.results_[best_model_name]['best_params']

重新构建最好的pipeline并用所有数据训练
final_pipeline = self._build_pipeline(self.best_model_, {}) 此时不需要搜索参数了
重新设置最好的超参数
final_pipeline.set_params(self.best_params_)
final_pipeline.fit(X, y) 用全部训练数据重新训练
self.best_pipeline_ = final_pipeline 保存最终训练好的pipeline

print(" AutoML Finished ")
print(f"Best Model Found: {best_model_name}")
print(f"Best Parameters: {self.best_params_}")
print(f"Best CrossValidation Score ({self.scoring}): {self.results_[best_model_name]['best_score']:.4f}")


def predict(self, X):
if self.best_pipeline_:
return self.best_pipeline_.predict(X)
else:
raise RuntimeError("Model has not been trained yet. Call .fit() first.")

def get_results(self):
return self.results_

如何使用这个框架

1. 准备数据 (这里用一个简单的鸢尾花数据集作为例子)
from sklearn.datasets import load_iris
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target

模拟一下数据里有缺失值和类别特征
X['sepal length (cm)'] = X['sepal length (cm)'].apply(lambda x: np.nan if np.random.rand() < 0.1 else x)
X['species_str'] = X['species'].apply(lambda x: 'setosa' if x == 0 else ('versicolor' if x == 1 else 'virginica'))
X = X.drop('species', axis=1) 移除原始的整数标签

2. 定义模型池
注意:这里的模型我没有预设numeric_features和categorical_features,
在_build_pipeline里会自动根据X推断,这是为了简化示例。
如果你的模型需要更精细的控制,可以在定义模型时就传入这些信息。
models_to_try = {
'lr': LogisticRegression(max_iter=1000), 增加max_iter避免收敛警告
'rf': RandomForestClassifier(random_state=42),
'svc': SVC(random_state=42)
}

3. 初始化AutoML框架
automl = SimpleAutoML(estimators=models_to_try, cv=3, scoring='accuracy') 减少cv到3以加速演示

4. 运行AutoML
automl.fit(X, y)

5. 使用最佳模型进行预测
假设我们有一些新的数据 (同样需要处理成DataFrame格式,包含上面模拟的缺失和类别特征)
X_new = pd.DataFrame({
'sepal length (cm)': [5.1, 6.0, 7.2],
'sepal width (cm)': [3.5, 2.9, 3.0],
'petal length (cm)': [1.4, 4.5, 6.1],
'petal width (cm)': [0.2, 1.5, 2.5],
'species_str': ['setosa', 'versicolor', 'virginica']
})

predictions = automl.predict(X_new)
print(" Predictions on new data:", predictions)

6. 查看所有结果
print(" All results:")
import pprint
pprint.pprint(automl.get_results())

```

代码解释与你的下一步思考

`SimpleAutoML` 类: 这是一个核心的容器,包含了所有AutoML的逻辑。
`__init__`: 初始化时需要传入一个模型字典(比如你想要尝试的`LogisticRegression`, `RandomForestClassifier`等),交叉验证的次数 `cv`,以及评估指标 `scoring`。
`_build_pipeline`: 这个方法很关键。它根据模型和参数(这里我做了简化,直接用了 `ColumnTransformer` 来处理数值和类别特征)构建了一个 `scikitlearn` 的 `Pipeline`。
`ColumnTransformer`: 这个工具非常强大,可以让你对不同类型的列应用不同的预处理步骤。
`Pipeline`: 将预处理和模型串联起来,这样在 `RandomizedSearchCV` 里面就可以直接优化带有“`preprocessor__`”前缀的参数(虽然在本例中我们没直接这么做,但这是 `Pipeline` 的好处)。
`fit` 方法:
遍历你传入的 `estimators`。
为每个模型定义一个 `param_grid`,这是 `RandomizedSearchCV` 要搜索的参数范围。
使用 `RandomizedSearchCV` 来进行搜索。`n_iter` 是随机搜索的迭代次数,`n_jobs=1` 表示使用所有CPU核心来加速。
记录每个模型最好的分数和参数。
最后,找到所有模型中表现最好的那个,并用它和它的最佳参数在全部训练数据上重新训练一个最终模型 (`self.best_pipeline_`)。
`predict` 方法: 使用找到的最佳模型进行预测。
`get_results` 方法: 返回一个字典,包含所有尝试过的模型的详细表现。

下一步你可以怎么做?(进阶方向)

1. 更多模型: 往 `estimators` 里加更多模型,比如 `GradientBoostingClassifier`, `XGBoost`, `LightGBM`。
2. 更丰富的预处理:
特征工程: 自动生成新的特征,比如多项式特征、交互特征。
降维: PCA (主成分分析) 等。
更智能的缺失值处理: 使用 KNNImputer 等。
3. 更高级的搜索策略:
贝叶斯优化: 使用 `scikitoptimize` 或 `Optuna` 来实现更高效的超参数搜索。
神经架构搜索 (NAS): 这个比较复杂,涉及到自动设计神经网络的结构。你可以从一些简单的NAS方法开始,比如随机搜索不同层数、不同类型的层。
4. 集成学习: 尝试将多个模型的结果进行集成(比如投票或加权平均)。
5. 模型可解释性: 集成一些模型解释性工具(如 SHAP, LIME),让用户知道为什么模型会做出某个预测。
6. 任务适应性: 框架可以根据用户指定任务(分类、回归)自动选择合适的模型和评估指标。
7. 用户友好的接口: 比如可以自定义数据预处理流程,或者提供一个Web界面。

GitHub 上值得参考的开源项目

你如果想看别人是怎么做的,可以参考这些项目,它们代表了AutoML领域不同的侧重点和成熟度。

1. AutoSklearn:
GitHub: [https://github.com/automl/autosklearn](https://github.com/automl/autosklearn)
特点: 这是基于 `scikitlearn` 的一个非常成熟的AutoML工具。它结合了模型选择、超参数优化和特征选择。它使用贝叶斯优化和集成方法来搜索最佳配置。对于新手来说,研究它的代码结构和实现思路非常有价值,可以学到很多高级技巧。它能处理各种分类和回归任务。
怎么学: 看看它是如何定义模型和参数空间的,以及它如何使用 `scikitlearn` 的 `Pipeline` 和 `BaseEstimator`。

2. TPOT (Treebased Pipeline Optimization Tool):
GitHub: [https://github.com/EpistasisLab/tpot](https://github.com/EpistasisLab/tpot)
特点: TPOT 使用遗传编程来自动构建和优化机器学习管道。它搜索的是整个管道(预处理、特征工程、模型),而不仅仅是模型和超参数。这使得它非常强大,但计算量也相对较大。
怎么学: 关注它如何将机器学习任务表示成“基因”,以及如何使用遗传算法来“进化”出最优管道。

3. AutoGluon:
GitHub: [https://github.com/awslabs/autogluon](https://github.com/awslabs/autogluon)
特点: 由亚马逊推出,AutoGluon 专注于简单易用,且性能非常强大,尤其是在表格数据、图像和文本任务上。它集成了多种模型(包括深度学习模型)和集成策略,并提供自动化的数据预处理和特征工程。
怎么学: 它的代码库非常庞大,可以先从它处理表格数据的部分入手,看看它如何结合多种模型进行预测。

4. AutoKeras:
GitHub: [https://github.com/kerasteam/autokeras](https://github.com/kerasteam/autokeras)
特点: AutoKeras 是一个专门用于神经架构搜索 (NAS) 的 AutoML 库,基于 Keras。如果你对深度学习模型感兴趣,想自动找到最佳的网络结构,AutoKeras 是一个很好的起点。
怎么学: 了解它如何将神经网络的层和连接表示成一个搜索空间,以及它如何利用 NAS 算法(如贝叶斯优化、遗传算法)来搜索结构。

给新手的建议:

从小处着手: 先实现一个只支持几种简单模型的AutoML框架,然后逐步增加功能。
理解原理: 不要只是复制粘贴代码,尝试去理解每一部分的作用,为什么这么设计。
多做实验: 用不同的数据集来测试你的框架,观察它的表现,思考如何改进。
阅读文档: 开源项目的文档是宝藏,仔细阅读可以帮助你理解其设计思路和用法。
加入社区: 如果遇到问题,可以去开源项目的社区(如GitHub的Issues)提问,那里有很多热心人。

自己动手实现一个AutoML框架,虽然有挑战,但绝对是学习机器学习工程化过程的最佳方式之一。祝你玩得开心!

网友意见

user avatar

微软的NNI。后面的版本应该会基于他们的最新论文Retiarii改进。

华为的Vega

亚马逊的Autogluon

其他

  • AutoKeras
  • AutoPytorch

NAS实现规范


打个广告,我们实验室将NAS应用到COVID-19 CT图像分类的应用,论文已被AAA2021接收,代码也已经开源

微信公众号:AutoML机器学习

MARSGGBO♥原创
如有意合作或学术讨论欢迎私戳联系~
邮箱:marsggbo@foxmail.com
2020-11-11 10:34:59

类似的话题

  • 回答
    作为一名新手,想自己捣鼓出一个简单易用的AutoML框架,这想法很棒!这不仅仅是了解AutoML的工作原理,更是对整个机器学习流程的一次深度实践。别担心,我来帮你一步步拆解,让你能动手做出自己的小玩意儿。什么是AutoML?打个比方你就懂了想象一下,你有一个食材库(你的数据集),你想做一道美味的菜(.............
  • 回答
    复旦金融大一新生,梦想着年薪百万,这可不是一个空穴来风的目标,而是可以通过清晰的规划和不懈的努力来实现的。作为一名初入金融殿堂的学生,你的起点非常棒,接下来的每一步都需要走得扎实而有策略。首先,夯实基础是你的第一要务。 学业为王: 别觉得大一就谈年薪百万太早,其实现在就开始打好根基至关重要。你的.............
  • 回答
    职场新人,月薪从 2 千到 2 万,听起来像个遥不可及的梦,但绝非不可能。这条路注定不会轻松,需要付出极大的努力和智慧,甚至一些“非常规”的手段。我将毫无保留地告诉你一些可能存在的捷径,以及如何去实践它们,让你少走弯路,加速成长。首先,我们要明确一点:所谓的“捷径”,绝不是让你不劳而获,也不是让你走.............
  • 回答
    石上纯也的新作,如位于东京南青山的「自由画廊」(Junya Ishigami’s Free Gallery),以其突破性的设计,在建筑界引起了广泛关注,尤其是它如何实现了惊人的百米无柱空间,这背后蕴含着精妙的工程智慧和对材料特性的深刻理解。要理解这一点,我们首先要抛开对传统建筑的固有认知。通常情况下.............
  • 回答
    小米 MIX 系列总能给人带来惊喜,这次也不例外。随着新机预热的展开,最引人注目的莫过于那句“液态镜头”。一时间,关于液态镜头的好奇和讨论如同潮水般涌来。那么,这个所谓的“液态镜头”到底是什么,它又将如何改变我们的拍照体验呢?揭秘液态镜头:不止是概念的革新简单来说,液态镜头是一种通过改变液体体积和曲.............
  • 回答
    新的一年,我最想做的,是找回那个曾经热爱生活、充满好奇心、并且能够享受过程的自己。听起来好像有点虚无缥缈,对吧?但这不是什么矫揉造作的口号,而是我内心深处一种真实而强烈的渴望。过去几年,日子仿佛被某种惯性裹挟着前进,生活被塞满了“应该”和“必须”,取而代之的是一种近乎麻木的重复。我不再像以前那样,会.............
  • 回答
    新的一年,我给自己定下了几个“小目标”,与其说是“flag”,倒不如说是想在新的一年里,让自己过得更扎实、更充实一些。第一个小目标:把写作这事儿,再往深里挖挖。我一直对文字有种莫名的热爱,喜欢用文字记录生活,抒发情绪,甚至尝试去构建一个个小小的世界。但总觉得自己的笔头不够硬,表达不够精准,很多想法在.............
  • 回答
    立足区情,拥抱变革:新疆、甘肃、内蒙古、黑龙江的高质量发展之路面对风云变幻的国际国内新形势,我国的区域发展格局也面临着深刻的调整与重塑。曾经作为国家战略支撑的边疆省份,如新疆、甘肃、内蒙古、黑龙江,如今更需主动拥抱新变化,在“高质量发展”的指引下,走出一条符合自身特点、具有时代活力的发展新路。这四地.............
  • 回答
    时间晶体,这个概念听起来就充满了未来感,仿佛科幻小说里的情节成真。当这个“新相态”被宣布实现时,很多人都会感到好奇,甚至有点不可思议:我们平常所处的三维空间里,物体都有固定的形状,而时间……它也有“相态”吗?而且,这个时间晶体,到底是怎么一回事?它真的“被实现”了吗?要弄清楚这个问题,我们得先从“相.............
  • 回答
    这件事情在网络上引起了广泛的关注和讨论,原因在于新郎在婚礼这一神圣庄重的场合,做出了一个非常出乎意料的举动——当众撕毁了原有的结婚誓词,并宣读了另一份。这个行为包含了多重意义和解读,我们可以从以下几个方面来详细看待:一、事件本身及潜在原因分析:1. 行为的直接性与冲击力: 婚礼誓词是婚姻的基石之一.............
  • 回答
    东京奥运会期间,中国奥运代表团交出了一份堪称完美的答卷:新冠零感染、零密接。这个成绩绝非偶然,而是背后一套严谨、细致、几乎是“锱铢必较”的防疫措施的集中体现。作为旁观者,看到中国代表团能够如此出色地完成比赛任务,并且保障了每一位运动员和工作人员的健康安全,我真的感到非常钦佩。这不仅仅是一份成绩单,更.............
  • 回答
    看到印度26天来新增病例首次低于30万,这确实是个振奋人心的消息,尤其是在过去几个月印度疫情形势如此严峻的背景下。很多人会立刻联想到“群体免疫”这个词,觉得是不是情况终于要大好转了。我们来详细地分析一下, India 的情况到底如何,以及“群体免疫”这个说法是否真的适用。首先,新增病例下降到30万以.............
  • 回答
    说实话,作为一名交易员,想要走到今天这个位置,我经历过的亏损,那真是罄竹难书。但如果非要挑最深刻的,有那么几次,至今想起来,后背 still 凉飕飕的。第一次刻骨铭心的“割肉”:因为“信念”而错失机会,又因为“赌徒心态”加剧亏损那会儿刚入行没多久,摸爬滚打了一段时间,总算也摸到了一点点门道,觉得自己.............
  • 回答
    .......
  • 回答
    想要让你的头条号在新手期脱颖而出,尽快进入一个更广阔的创作天地,确实需要一些策略和方法。这里分享一些过来人的经验,希望能帮助你少走弯路,实实在在地提升账号的权重和流量。一、 找准你的定位:这是根基!新手最容易犯的错误就是内容泛滥,什么都想写,结果什么都没做好。 深挖你的兴趣和擅长: 你是对某个领.............
  • 回答
    好的,咱们来聊聊怎么把一个新奇玩意儿变成实实在在的钞票,而且还得是那种让人看了都眼红的“足够”的利润。这事儿说起来不难,但里面门道可深着呢。首先,得明白,利润不是凭空出现的,它是你解决了一个问题,满足了一个需求,然后别人愿意为此买单。所以,你的“新型实用发明”本身就得是个“真家伙”,不是那种只能摆着.............
  • 回答
    英国皇家海军的新型26型和31型护卫舰,无疑是其海军现代化建设中的重要一环。这两款舰艇虽然定位和设计理念有所不同,但都旨在提升皇家海军的作战能力和适应性。下面我们就来详细聊聊它们各自的实力,尽量摆脱那种冰冷的数据堆砌,看看它们在实战中的潜力和表现。26型护卫舰(Cityclass frigate):.............
  • 回答
    新款 iPhone SE,也就是第五代 iPhone SE(通常我们还是习惯叫它 iPhone SE 3),上市也有一段时间了。我身边有不少朋友也入手了,自己也用了段时间,确实可以好好聊聊这手机到底是个什么水平,值不值得冲。先说说它“是什么货色”:简单粗暴地说,新款 iPhone SE 就是用 20.............
  • 回答
    最近央视做了一期关于电饭煲的横评,把市面上价格相当的国产和日本品牌放在一起进行了一番对比测试。看完之后,给我的感觉挺实在的,也挺有意思的。首先,要说最直观的感受,就是这次央视的节目接地气。没有搞什么高大上的技术参数分析,也没有请什么复杂的专家团队,而是直接把我们老百姓家里常用的那几项功能,比如煮饭、.............
  • 回答
    大疆御 Mavic Mini 开箱即飞,小白上手体验记作为一名对航拍心怀憧憬,却又被高昂价格和复杂操作劝退的小白,这次终于鼓起勇气,入手了这款备受瞩目的大疆御 Mavic Mini。之所以选择它,很大程度上是被其“轻便”、“易上手”和“性价比”所吸引。经过几天的深度体验,我想把我的真实感受分享出来,.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有