作者:於樂,騰訊 CSIG 工程師
一、方案描述
1.1 概述
近年來,人工智能的風潮為醫療行業帶來一場全新革命,AI 在輔助診斷、疾病預測、療法選擇等方面發揮着重要作用。機器學習領域的特征選擇和有監督學習建模方法越來越多地用於疾病預測和輔助診斷,常用的算法如決策樹、隨機森林、邏輯回歸等。乳腺癌是目前發病率僅次於肺癌的常見癌症,機器學習算法能夠分析已有的臨床乳腺癌數據,得到與乳腺癌發病關系最密切的特征,這能夠極大地幫助醫生進行早期診斷,及時拯救患者。本方案結合智能鈦機器學習平台(TI-ONE)、智能鈦彈性模型服務(TI-EMS)、騰訊雲流計算 Oceanus(Flink)、消息隊列 CKafka、雲數據倉庫 ClickHouse、對象存儲(COS)針對乳腺癌預測案例使用決策樹分類算法實現全流程解決方案,包括離線模型訓練、實時特征工程及實時在線預測功能。
1.2 方案架構
首先由 TI-ONE 進行離線模型訓練,將模型文件存放在 COS 上,然后由 TI-EMS 將模型文件封裝成一個 PMML 模型服務供流計算 Oceanus 調用。流計算 Oceanus 利用 Datagen Connector 模擬實時生成特征數據后存放在 CKafka 上,之后流計算 Oceanus 取 CKafka 的特征數據經過數據轉換傳入到 TI-EMS 的 PMML 模型服務中調用決策樹分類模型並返回預測結果,最后將預測結果存儲在 ClickHouse 中。
涉及產品列表:
-
流計算 Oceanus(Flink)
-
智能鈦機器學習平台(TI-ONE)
-
智能鈦彈性模型服務(TI-EMS)
-
消息隊列 CKafka
-
雲數據倉庫 ClickHouse
-
對象存儲(COS)
二、前置准備
2.1 創建私有網絡 VPC
私有網絡(VPC)是一塊您在騰訊雲上自定義的邏輯隔離網絡空間,在構建流計算 Oceanus、CKafka、COS、ClickHouse 集群等服務時選擇的網絡建議選擇同一個 VPC,網絡才能互通。否則需要使用對等連接、NAT 網關、VPN 等方式打通網絡。私有網絡 VPC 創建步驟請參考 幫助文檔 [1] 。
2.2 創建流計算 Oceanus 集群
流計算 Oceanus 是大數據產品生態體系的實時化分析利器,是基於 Apache Flink 構建的具備一站開發、無縫連接、亞秒延時、低廉成本、安全穩定等特點的企業級實時大數據分析平台。流計算 Oceanus 以實現企業數據價值最大化為目標,加速企業實時化數字化的建設進程。
在流計算Oceanus 控制台 [2] 的【集群管理】->【新建集群】頁面創建集群,選擇地域、可用區、VPC、日志、存儲,設置初始密碼等。VPC 及子網使用剛剛創建好的網絡。創建完后 Flink 的集群如下:
2.3 創建 CKafka 實例
進入 CKafka 控制台 [3],選擇左側【實例列表】,單擊【新建】進行購買,注意【地域】需選擇 VPC 所在地域,VPC 選擇及子網選擇之前創建的 VPC 和子網。新建成功后,單擊實例進入實例詳情頁面,單擊【topic 管理】新建 topic。
2.4 創建 COS 實例
進入 COS 控制台 [4],選擇左側【存儲桶列表】,單擊【創建存儲桶】,【所屬地域】選擇 VPC 所在地域,具體操作細節可參考 COS 控制台快速入門 [5]。
2.5 創建 ClickHouse 集群
進入 ClickHouse 控制台 [6],單擊【新建集群】創建 ClickHouse 集群,注意地域、可用區和網絡的選擇。創建成功之后選擇一台與其同 VPC 的 CVM 進入,在該 CVM 下下載 ClickHouse 客戶端,創建數據庫和表。具體操作可參考 ClickHouse 快速入門 [7]。
# 下載 ClickHouse-Client 命令
wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-client-20.7.2.30-2.noarch.rpm
wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-common-static-20.7.2.30-2.x86_64.rpm
# 安裝客戶端
rpm -ivh *.rpm
# 使用 tcp 端口登陸 ClickHouse 集群,IP 地址可通過控制台查看
clickhouse-client -hxxx.xxx.xxx.xxx --port 9000
-- 創建數據庫
CREATE DATABASE IF NOT EXISTS testdb ON CLUSTER default_cluster;
-- 創建表
CREATE TABLE testdb.model_predict_result_1 on cluster default_cluster (res String,Sign Int8) ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/{layer}-{shard}/testdb/model_predict_result_1', '{replica}',Sign) ORDER BY res;
2.6 注冊開通 TI-ONE 服務
智能鈦機器學習平台是為 AI 工程師打造的一站式機器學習服務平台,為用戶提供從數據預處理、模型構建、模型訓練、模型評估到模型服務的全流程開發及部署支持。
進入 TI-ONE 控制台 [8],在彈出的頁面上開通【角色授權】。
-
單擊【前往訪問管理】,頁面將跳轉至訪問管理控制台。
-
單擊【同意授權】,即可創建服務預設角色並授予智能鈦機器學習平台相關權限。
角色授權開通后,返回 TI-ONE 控制台 [8],開通所需地區的后付費計費模式。 具體步驟可參考 TI-ONE 的官方文檔 注冊與開通服務 [9]。
2.7 注冊開通 TI-EMS 服務
智能鈦彈性模型服務(Tencent Intelligence Elastic Model Service,TI-EMS)是具備虛擬化異構算力和彈性擴縮容能力的無服務器化在線推理平台。
角色授權: 進入 TI-EMS 控制台 [10],參考上面步驟進行【角色授權】 創建專用資源組: TI-EMS 平台目前提供公共資源組和專用資源組兩種模式,關於兩種模式的優缺點可參見官網文檔 資源組管理 [11]。本例子通過流計算 Oceanus 調用 TI-EMS 服務,需打通相對應的 VPC,因此需選用專用資源組。關於專用資源組的開通方式可參見官網文檔 資源組管理 [11]。
三、方案實現
本文通過 TI-ONE 平台,利用決策樹算法搭建乳腺癌預測模型(決策樹分類模型),將模型結果保存在 COS 上 (用戶也可以自己在本地訓練完成后將訓練好的模型文件保存在本地或者 COS,之后通過 TI-EMS 創建模型服務配置即可調用)。然后由流計算 Oceanus 模擬生成實時特征數據,以 CSV 格式存儲在 CKafka,再通過流計算 Oceanus 取 CKafka 的特征數據作為入參,結合 TI-EMS 進行乳腺癌模型的實時調用,預測結果保存在 ClickHouse 中。
3.1 離線模型訓練
3.1.1 數據集介紹
本次任務我們采用公開的 乳腺癌數據集 [12],該數據集共包含 569 個樣本,其中 357 個陽性(y = 1)樣本,212 個陰性(y = 0)樣本;每個樣本有 32 個特征,但本次實驗中選取其中 10 個特征。數據信息及模型訓練流程請參考 TI-ONE 最佳實踐 乳腺癌預測 [13]。數據集具體字段信息如下:
特征和標簽(Attribute) | 取值范圍(domain) |
Clump Thickness | 0 ≤ n ≤ 10 |
Uniformity of Cell Size | 0 ≤ n ≤ 10 |
Uniformity of Cell Shape | 0 ≤ n ≤ 10 |
Marginal Adhsion | 0 ≤ n ≤ 10 |
Single Epithelial Cell Size | 0 ≤ n ≤ 10 |
Bare Nuclei | 0 ≤ n ≤ 10 |
Bland Chromation | 0 ≤ n ≤ 10 |
Normal Nucleoli | 0 ≤ n ≤ 10 |
Mitoses | 0 ≤ n ≤ 10 |
(標簽y)Class | 0 , 1 |
數據集具體內容抽樣展示如下(前9列:特征,第10列:標簽):
列1 | 列2 | 列3 | 列4 | 列5 | 列6 | 列7 | 列8 | 列9 | 列10 |
3 | 2 | 3 | 0 | 0 | 2 | 1 | 0 | 1 | 1 |
4 | 1 | 3 | 0 | 1 | 0 | 1 | 4 | 1 | 0 |
4 | 1 | 7 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
3.1.2 離線模型訓練
模型訓練: 進入 TI-ONE 控制台 [8],點擊左側【工程列表】,單擊【新建工程】,【COS Bucket】選擇之前創建好的 COS。進入【工作流編輯頁面】,按需拖拽對應的輸入、算法、輸出等模塊到右側頁面即可快速構建一個完整的模型訓練框架,具體構建方法可參考官網文檔 使用可視化建模構建模型 [14]。 當然,用戶也可以自行編寫代碼上傳到【Notebook】頁面進行模型訓練,具體請參考官網 使用 Notebook 構建模型 [15],另外也可以 使用 TI SDK 構建模型 [16]。
模型效果: 運行成功后,右鍵單擊【二分類任務評估】>【評估指標】,即可查看模型效果。
模型保存: 右鍵單擊模型文件(【決策樹分類】左側小圓圈),點擊【模型操作】>【保存到模型倉庫】,保存成功后返回【模型倉庫】頁面,查看保存的模型服務。
3.2 實時特征工程
本示例基於流計算 Oceanus SQL 作業生成,使用 Datagen 連接器模擬生成實時特征數據,並將結果以 CSV 格式存儲在 CKafka 中,供之后進行模型調用。 用戶可以根據實際業務情況自行選擇 SQL、ETL、JAR 作業方式進行實時特征數據的輸出。
3.2.1 創建 Source
-- random source 用於模擬患者病歷實時特征數據
CREATE TABLE random_source (
ClumpThickness INT,
UniformityOfCellSize INT,
UniformityOfCellShape INT,
MarginalAdhsion INT,
SingleEpithelialCellSize INT,
BareNuclei INT,
BlandChromation INT,
NormalNucleoli INT,
Mitoses INT
) WITH (
'connector' = 'datagen',
'rows-per-second'='1', -- 每秒產生的數據條數
'fields.ClumpThickness.kind'='random', -- 無界的隨機數
'fields.ClumpThickness.min'='0', -- 隨機數的最小值
'fields.ClumpThickness.max'='10', -- 隨機數的最大值
'fields.UniformityOfCellSize.kind'='random', -- 無界的隨機數
'fields.UniformityOfCellSize.min'='0', -- 隨機數的最小值
'fields.UniformityOfCellSize.max'='10', -- 隨機數的最大值
'fields.UniformityOfCellShape.kind'='random', -- 無界的隨機數
'fields.UniformityOfCellShape.min'='0', -- 隨機數的最小值
'fields.UniformityOfCellShape.max'='10', -- 隨機數的最大值
'fields.MarginalAdhsion.kind'='random', -- 無界的隨機數
'fields.MarginalAdhsion.min'='0', -- 隨機數的最小值
'fields.MarginalAdhsion.max'='10', -- 隨機數的最大值
'fields.SingleEpithelialCellSize.kind'='random', -- 無界的隨機數
'fields.SingleEpithelialCellSize.min'='0', -- 隨機數的最小值
'fields.SingleEpithelialCellSize.max'='10', -- 隨機數的最大值
'fields.BareNuclei.kind'='random', -- 無界的隨機數
'fields.BareNuclei.min'='0', -- 隨機數的最小值
'fields.BareNuclei.max'='10', -- 隨機數的最大值
'fields.BlandChromation.kind'='random', -- 無界的隨機數
'fields.BlandChromation.min'='0', -- 隨機數的最小值
'fields.BlandChromation.max'='10', -- 隨機數的最大值
'fields.NormalNucleoli.kind'='random', -- 無界的隨機數
'fields.NormalNucleoli.min'='0', -- 隨機數的最小值
'fields.NormalNucleoli.max'='10', -- 隨機數的最大值
'fields.Mitoses.kind'='random', -- 無界的隨機數
'fields.Mitoses.min'='0', -- 隨機數的最小值
'fields.Mitoses.max'='10' -- 隨機數的最大值
);
3.2.2 創建 Sink
CREATE TABLE `KafkaSink` (
ClumpThickness INT,
UniformityOfCellSize INT,
UniformityOfCellShape INT,
MarginalAdhsion INT,
SingleEpithelialCellSize INT,
BareNuclei INT,
BlandChromation INT,
NormalNucleoli INT,
Mitoses INT
) WITH (
'connector' = 'kafka', -- 可選 'kafka','kafka-0.11'. 注意選擇對應的內置 Connector
'topic' = 'topic-decision-tree-predict-1', -- 替換為您要消費的 Topic
'properties.bootstrap.servers' = '172.28.28.211:9092', -- 替換為您的 Kafka 連接地址
'properties.group.id' = 'RealTimeFeatures', -- 必選參數, 一定要指定 Group ID
'format' = 'csv'
);
3.2.3 編寫業務 SQL
INSERT INTO `KafkaSink`
SELECT * FROM `random_source`
3.2.4 選擇 Connector
點擊【作業參數】,在【內置 Connector】選擇 flink-connector-kafka
,點擊【保存】>【發布草稿】運行作業。
3.2.5 查詢數據
進入 CKafka 控制台 [3],選擇相應的 CKafka 示例進入,單擊【topic 管理】,選擇對應的 topic,查詢寫入數據。
3.3 實時預測
本示例基於流計算 Oceanus JAR 作業方式演示,首先將存儲在 CKafka 的特征數據提取出來,經過簡單的數據格式轉換發送到 TI-EMS 服務進行模型調用,並將返回結果存儲在 ClickHouse 中。本示例 使用單一的在線推理服務,用戶可根據自己實際需求做負載均衡。
3.3.1 啟動模型服務
進入 TI-ONE 控制台 [8],點擊左側【模型倉庫】,選擇對應的模型服務單擊【啟動模型服務】,【資源組】選擇之前創建好的專用資源組。 創建成功之后返回 TI-EMS 控制台 [10],在左側的【模型服務】>【在線推理】頁面查看所創建的模型服務。
3.3.2 公網調用模型測試
-
單擊右側【更多】>【調用】,創建公網調用地址。
-
啟動控制台,新建
data.json
文件,在某一文件夾下運行如下代碼:
# 請將 <訪問地址>/<密鑰> 替換為實際的 IP 地址/密鑰
curl -H "Content-Type: application/json" \
-H "x-Auth-Token: <密鑰>" \
-X POST <訪問地址>/v1/models/m:predict -d
data.json
數據格式如下:
{"instances" : [{"_c0": 3, "_c1": 2, "_c2": 3, "_c3": 0, "_c4": 0, "_c5": 2, "_c6": 1, "_c7": 0, "_c8": 1}]}
模型調用返回結果如下:
{"predictions": [{"pmml(prediction)":"1","probability(0)":"0.47058823529411764","probability(1)":"0.5294117647058824","prediction":"1.0","label":"1"}]}
3.3.3 通過流計算 Oceanus 調用模型服務
除了可以使用公網調用模型外,還可以使用 VPC 方式調用模型。本小節着重介紹如何使用流計算 Oceanus JAR 作業的方式調用模型進行實時預測。
-
本地代碼開發、調試。
-
進入流計算Oceanus 控制台 [2],單擊左側【依賴管理】新建依賴並上傳 JAR 包。
-
進入【作業管理】頁面,創建 JAR 作業,選擇之前創建好的流計算 Oceanus 集群。
-
單擊【開發調試】指定相應的主程序包和主類,點擊【作業調試】,【內置 Connector】選擇
flink-connector-clickhouse
和flink-connector-kafka
。
ClickHouse 數據查詢:
Java 代碼如下:
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.table.api.Table;
import org.apache.flink.util.Collector;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.json.JSONObject;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.Properties;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
public class OnlinePredict {
public static final Logger logger = LoggerFactory.getLogger(OnlinePredict.class);
public static void main(String[] args) throws Exception {
// kafka配置參數解析
final ParameterTool parameterTool = ParameterTool
.fromPropertiesFile(OnlinePredict.class.getResourceAsStream("/KafkaSource.properties"));
// 實例化運行環境
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMode()
.build();
StreamExecutionEnvironment streamEnv = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(streamEnv, settings);
// checkpoint配置
streamEnv.enableCheckpointing(parameterTool.getLong("flink.stream.checkpoint.interval", 30_000));
streamEnv.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// 重啟策略
streamEnv.getConfig().setRestartStrategy(RestartStrategies.fixedDelayRestart(4, 10_000));
// source、transfer、sink
DataStream<String> stringResult = streamEnv.addSource(buildKafkaSource(parameterTool))
.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String value, Collector<String> out) throws Exception {
String paramInput = inputDataTransfer(value);
String outputData = sendHttpData(paramInput);
out.collect(outputData);
}
});
Table tableResult = tableEnv.fromDataStream(stringResult);
tableEnv.createTemporaryView("resultSink",tableResult);
tableEnv.executeSql("CREATE TABLE `CKSink` (\n" +
" res STRING,\n" +
" PRIMARY KEY (`res`) NOT ENFORCED\n" +
") WITH (\n" +
" 'connector' = 'clickhouse',\n" +
" 'url' = 'clickhouse://172.28.1.138:8123',\n" +
" 'database-name' = 'testdb',\n" +
" 'table-name' = 'model_predict_result_1',\n" +
" 'table.collapsing.field' = 'Sign'\n" +
")");
tableEnv.executeSql("insert into CKSink select * from resultSink");
}
// kafka source
public static SourceFunction<String> buildKafkaSource(ParameterTool parameterTool) throws Exception {
Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, parameterTool.get("kafka.source.bootstrap.servers"));
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, parameterTool.get("kafka.source.auto.offset.reset", "latest"));
properties.put(ConsumerConfig.GROUP_ID_CONFIG, parameterTool.get("kafka.source.group.id"));
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<String>(
parameterTool.get("kafka.source.topic"),
new SimpleStringSchema(),
properties);
consumer.setStartFromGroupOffsets();
return consumer;
}
// kafka 數據格式轉換
// 返回數據格式:{"instances" : [{"_c0": 3, "_c1": 2, "_c2": 3, "_c3": 0, "_c4": 0, "_c5": 2, "_c6": 1, "_c7": 0, "_c8": 1}]}
public static String inputDataTransfer(String value) {
String[] input = value.split(",");
ArrayList<JSONObject> dataListMap = new ArrayList<JSONObject>();
JSONObject jsondata = new JSONObject();
for (int i = 0; i < input.length; i++) {
jsondata.put("_c" + i, Double.parseDouble(input[i]));
}
dataListMap.add(jsondata);
String param = "{\"instances\":" + dataListMap.toString() + "}";
return param;
}
// TI-EMS 模型在線推理服務調用
// 返回數據格式如下:{"predictions": [{"pmml(prediction)":"1","probability(0)":"0.47058823529411764","probability(1)":"0.5294117647058824","prediction":"1.0","label":"1"}]}
public static String sendHttpData(String paramJson) throws Exception {
String data = null;
try {
// 請將 xx.xx.xx.xx:xxxx 替換為實際的 IP 地址,參考 3.2.2 圖中所示 創建 VPC 調用
String url = "http://xx.xx.xx.xx:xxxx/v1/models/m:predict";
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
post.addHeader("Content-type", "application/json");
post.addHeader("Accept", "application/json");
// 請將 xxxxxxxxxx 替換為實際密鑰,參考 3.2.2 圖中所示 創建 VPC 調用
post.addHeader("X-AUTH-TOKEN", "xxxxxxxxxx");
StringEntity entity = new StringEntity(paramJson, java.nio.charset.Charset.forName("UTF-8"));
post.setEntity(entity);
HttpResponse response = client.execute(post);
// 判斷是否正常返回
if (response.getStatusLine().getStatusCode() == 200) {
// 解析數據
HttpEntity resEntity = response.getEntity();
data = EntityUtils.toString(resEntity);
} else {
data = "error input";
}
System.out.print(data);
System.out.println(data);
} catch (Throwable e) {
logger.error("", e);
}
return data;
}
}
Kafka Source 參數配置:
kafka.source.bootstrap.servers=172.28.28.211:9092
kafka.source.topic=topic-decision-tree-predict-1
kafka.source.group.id=RealTimePredict1
kafka.source.auto.offset.reset=latest
POM 依賴:
<properties>
<flink.version>1.11.0</flink.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-clickhouse</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.11</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20201115</version>
<scope>compile</scope>
</dependency>
</dependencies>
四、總結
-
新版 Flink 1.13 集群無需用戶自己選擇內置 Connector,平台將自動匹配。
-
除了使用 CKafka 及 ClickHouse 作為數據倉庫外,還可以使用 Hive、Mysql、PG 等作為數倉,根據用戶實際需求自行選擇。
-
本方案最簡化了實時特征工程,用戶可以根據自身業務需求采用 SQL、JAR、ETL 作業的方式完成實時特征工程。
-
本方案只初始化了一個 PMML 服務提供流計算 Oceanus 調用,如遇數據背壓情況可增多 PMML 服務循環調用。
-
TI-ONE、TI-EMS 平台暫時不支持實時訓練模型,如需更新模型可以自行編寫定時腳本拉取數據在 TI-ONE 平台訓練更新。
五、參考地址
[1] VPC 幫助文檔:https://cloud.tencent.com/document/product/215/36515
[2] Oceanus 控制台:https://console.cloud.tencent.com/oceanus/job
[3] CKafka 控制台:https://console.cloud.tencent.com/ckafka/overview
[4] COS 控制台:https://console.cloud.tencent.com/cos5
[5] COS 控制台快速入門:https://cloud.tencent.com/document/product/436/38484
[6] ClickHouse 控制台:https://console.cloud.tencent.com/cdwch
[7] ClickHouse 快速入門:https://cloud.tencent.com/document/product/1299/49824
[8] TI-ONE 控制台:https://console.cloud.tencent.com/tione
[9] 注冊與開通 TI-ONE 服務:https://cloud.tencent.com/document/product/851/39086
[10] TI-EMS 控制台:https://console.cloud.tencent.com/tiems/overview
[11] TI-EMS 資源組管理:https://cloud.tencent.com/document/product/1120/38968
[12] 乳腺癌數據集:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/
[13] 乳腺癌預測:https://cloud.tencent.com/document/product/851/35127
[14] 使用可視化建模構建模型:https://cloud.tencent.com/document/product/851/44432
[15] 使用 Notebook 構建模型:https://cloud.tencent.com/document/product/851/44434
[16] 使用 TI SDK 構建模型:https://cloud.tencent.com/document/product/851/44435
關注“騰訊雲大數據”公眾號,技術交流、最新活動、服務專享一站 Get~