作者:Rising Odegua 与 Stephen Oni | 起源 TensorFlow
Danfo.js 是个 JavaScript 开源库,提供了高性能、直观易用的数据结构,反对结构化数据的操作和解决。Danfo.js 深受 Python Pandas 库的启发,并提供了相似的接口/API。因而相熟 Pandas API 且理解 JavaScript 的用户能够轻松上手。
Danfo.js 的一大指标是为 JavaScript 开发者提供数据处理、机器学习和 AI 工具。这与咱们的愿景统一,实质上也合乎 TensorFlow.js 团队向 Web 引入 ML 的指标。Numpy 和 Pandas 等开源库全面变革了 Python 中数据操作的便利性。因而很多工具都围绕它们构建,进一步推动了 Python 中 ML 生态系统的蓬勃发展。
- Danfo.js
https://danfo.jsdata.org/
Danfo.js 建设在 TensorFlow.js 上。也就是说,就像 Numpy 为 Pandas 的算术运算提供技术支持一样,咱们是利用 TensorFlow.js 为咱们的低级算术运算提供技术支持。
Danfo.js 的次要个性
Danfo.js 速度快。它基于 TensorFlow.js 构建,与张量无缝兼容。您能够在 Danfo 中加载张量,也能够将 Danfo 数据结构转换为张量。利用这两个库,既有了数据处理库 (Danfo.js),也有了弱小的 ML 库 (TensorFlow.js)。
以下示例将展现如何从张量对象创立 Danfo DataFrame:
const dfd = require("danfojs-node")const tf = require("@tensorflow/tfjs-node")let data = tf.tensor2d([[20,30,40], [23,90, 28]])let df = new dfd.DataFrame(data)let tf_tensor = df.tensorconsole.log(tf_tensor);tf_tensor.print()
输入:
Tensor { kept: false, isDisposedInternal: false, shape: [ 2, 3 ], dtype: 'float32', size: 6, strides: [ 3 ], dataId: {}, id: 3, rankType: '2'}Tensor [[20, 30, 40], [23, 90, 28]]
您能够轻松地将数组、JSON 或对象转换为 DataFrame 对象操作。
JSON 对象到 DataFrame:
const dfd = require("danfojs-node")json_data = [{ A: 0.4612, B: 4.28283, C: -1.509, D: -1.1352 }, { A: 0.5112, B: -0.22863, C: -3.39059, D: 1.1632 }, { A: 0.6911, B: -0.82863, C: -1.5059, D: 2.1352 }, { A: 0.4692, B: -1.28863, C: 4.5059, D: 4.1632 }]df = new dfd.DataFrame(json_data)df.print()
输入:
带列标签的对象数组到 DataFrame:
const dfd = require("danfojs-node")obj_data = {'A': [“A1”, “A2”, “A3”, “A4”], 'B': ["bval1", "bval2", "bval3", "bval4"], 'C': [10, 20, 30, 40], 'D': [1.2, 3.45, 60.1, 45], 'E': ["test", "train", "test", "train"] }df = new dfd.DataFrame(obj_data)df.print()
输入:
您能够轻松解决浮点和非浮点数据中的缺失数据(以 NaN 示意):
const dfd = require("danfojs-node")let data = {"Name":["Apples", "Mango", "Banana", undefined], "Count": [NaN, 5, NaN, 10], "Price": [200, 300, 40, 250]}let df = new dfd.DataFrame(data)let df_filled = df.fillna({columns: ["Name", "Count"], values: ["Apples",df["Count"].mean()]})df_filled.print()
输入:
基于智能标签的切片、花式索引和大数据集查问:
const dfd = require("danfojs-node")let data = { "Name": ["Apples", "Mango", "Banana", "Pear"] , "Count": [21, 5, 30, 10], "Price": [200, 300, 40, 250] }let df = new dfd.DataFrame(data)let sub_df = df.loc({ rows: ["0:2"], columns: ["Name", "Price"] })sub_df.print()
输入:
弱小的 IO 工具,用于从立体文件(CSV 和分隔)加载数据。残缺和分块均可:
const dfd = require("danfojs-node")//read the first 10000 rowsdfd.read_csv("file:///home/Desktop/bigdata.csv", chunk=10000) .then(df => { df.tail().print() }).catch(err=>{ console.log(err); })
DataFrame 和 Series 反对 OneHotEncoders、LabelEncoders 等弱小的数据预处理函数和 StandardScaler 和 MinMaxScaler 等 Scaler:
const dfd = require("danfojs-node")let data = ["dog","cat","man","dog","cat","man","man","cat"]let series = new dfd.Series(data)let encode = new dfd.LabelEncoder()encode.fit(series)let sf_enc = encode.transform(series)let new_sf = encode.transform(["dog","man"])
输入:
交互式、灵便且直观的 API,用于在浏览器中绘制 DataFrame 和 Series:
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://cdn.jsdelivr.net/npm/danfojs@0.1.1/dist/index.min.js"></script> <title>Document</title></head><body> <div id="plot_div"></div> <script> dfd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv") .then(df => { var layout = { title: 'A financial charts', xaxis: {title: 'Date'}, yaxis: {title: 'Count'} } new_df = df.set_index({ key: "Date" }) new_df.plot("plot_div").line({ columns: ["AAPL.Open", "AAPL.High"], layout: layout}) }).catch(err => { console.log(err); }) </script></body></html>
输入:
示例:泰坦尼克号幸存预测
以下是应用 Danfo.js 和 TensorFlow.js 的简略端到端分类工作。应用 Danfo 进行数据集的数据加载、操作和预处理,而后导出张量对象。
const dfd = require("danfojs-node")const tf = require("@tensorflow/tfjs-node")async function load_process_data() { let df = await dfd.read_csv("https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv") //A feature engineering: Extract all titles from names columns let title = df['Name'].apply((x) => { return x.split(".")[0] }).values //replace in df df.addColumn({ column: "Name", value: title }) //label Encode Name feature let encoder = new dfd.LabelEncoder() let cols = ["Sex", "Name"] cols.forEach(col => { encoder.fit(df[col]) enc_val = encoder.transform(df[col]) df.addColumn({ column: col, value: enc_val }) }) let Xtrain,ytrain; Xtrain = df.iloc({ columns: [`1:`] }) ytrain = df['Survived'] // Standardize the data with MinMaxScaler let scaler = new dfd.MinMaxScaler() scaler.fit(Xtrain) Xtrain = scaler.transform(Xtrain) return [Xtrain.tensor, ytrain.tensor] //return the data as tensors}
接下来应用 TensorFlow.js 创立一个简略的神经网络。
function get_model() { const model = tf.sequential(); model.add(tf.layers.dense({ inputShape: [7], units: 124, activation: 'relu', kernelInitializer: 'leCunNormal' })); model.add(tf.layers.dense({ units: 64, activation: 'relu' })); model.add(tf.layers.dense({ units: 32, activation: 'relu' })); model.add(tf.layers.dense({ units: 1, activation: "sigmoid" })) model.summary(); return model}
最初进行训练,首先将模型和解决后的数据加载为张量。这能够间接馈送到神经网络。
async function train() { const model = await get_model() const data = await load_process_data() const Xtrain = data[0] const ytrain = data[1] model.compile({ optimizer: "rmsprop", loss: 'binaryCrossentropy', metrics: ['accuracy'], }); console.log("Training started....") await model.fit(Xtrain, ytrain,{ batchSize: 32, epochs: 15, validationSplit: 0.2, callbacks:{ onEpochEnd: async(epoch, logs)=>{ console.log(`EPOCH (${epoch + 1}): Train Accuracy: ${(logs.acc * 100).toFixed(2)}, Val Accuracy: ${(logs.val_acc * 100).toFixed(2)}n`); } } });};train()
您可能留神到 Danfo 的 API 与 Pandas 十分类似,即便不是 Javascript 程序员也能够轻松浏览和了解代码。您可参考以上演示的残缺源代码 (https://gist.github.com/risen...。
结语
基于网络的机器学习曾经日趋成熟,对应的专用高效数据迷信工具必不可少。相似 Danfo.js 的工具让基于网络的利用能够轻松反对 ML 个性,从而让利用生态系统更加丰富多彩。
这场改革始于 TensorFlow.js 为 Python 带来的 ML 性能。咱们心愿为 Danfo.js 作为高效的伙伴一路提供反对。咱们对 Danfo.js 的倒退充斥期待!心愿它也能成为网络社区的要害成员。
- 在 CodePen 上操作 Danfo.js
https://codepen.io/risingodeg... - 官网入门指南
https://danfo.jsdata.org/gett... - Github 仓库
https://github.com/opensource... - OneHotEncoders
https://danfo.jsdata.org/api-... - LabelEncoders
https://danfo.jsdata.org/api-... - StandardScaler
https://danfo.jsdata.org/api-... - MinMaxScaler
https://danfo.jsdata.org/api-...