在Ignite中使用線性迴歸演算法
在本系列前面的文章中,簡單介紹了一下Ignite的機器學習網格,下面會趁熱打鐵,結合一些示例,深入介紹Ignite支援的一些機器學習演算法。
如果要找合適的資料集,會發現可用的有很多,但是對於線性迴歸來說,一個非常好的備選資料集就是房價,可以非常方便地從UCI網站獲取合適的資料。
在本文中會訓練一個線性迴歸模型,並且計算R2得分。
需要先準備一些資料,並且要將資料轉換成Ignite支援的格式,這通常是資料科學家需要花時間做的事。
首先,需要獲取原始資料並將其拆分成訓練資料(80%)和測試資料(20%)。Ignite暫時還不支援專用的資料拆分,路線圖中的未來版本會支援這個功能。但是就目前來說有許多可用的免費和開源工具可以執行這樣的資料拆分,或者也可以用一種Ignite支援的程式語言自己編寫這種程式碼。在本文中會使用下面自己編寫的程式碼來實現此任務:
from sklearn import datasets
import pandas as pd
# Load Boston housing dataset.
boston_dataset = datasets.load_boston()
x = boston_dataset.data
y = boston_dataset.target
# Split it into train and test subsets.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test www.mhylpt.com= train_test_split(x, y, test_size=0.2, random_state=23)
# Save train set.
train_ds = pd.DataFrame(x_train, columns=boston_dataset.feature_names)
train_ds["TARGET"] =www.michenggw.com y_train
train_ds.to_csv(www.gcyL157.com"boston-housing-train.csv", index=False, header=None)
# Save test set.
test_ds = pd.DataFrame(x_test, columns=boston_dataset.feature_names)
test_ds["TARGET"] = y_test
test_ds.to_csv("boston-housing-test.csv", index=False, header=None)
# Train linear regression model.
from sklearn.linear_model import LinearRegression
lr = LinearRegression(www.yigouyule2.cn)
lr.fit(x_train,www.mcyllpt.com y_train)
# Score result model.
lr.score(x_test, y_test)
這段程式碼從UCI網站上獲取可用的資料集,執行了資料的拆分,然後計算了R2得分。返回值為0.745021053016975,或者為74.5%,之後會將此值與Ignite的進行對比。
當訓練和測試資料準備好之後,就可以寫應用了,本文的演算法是:
讀取訓練資料和測試資料;
在Ignite中儲存訓練資料和測試資料;
使用訓練資料擬合線性迴歸模型;
將模型應用於測試資料;
確定模型的R2得分。
由於資料集非常小,可以將其載入到標準Java資料結構中,並直接從Java程式中執行線性迴歸。或者,也可以將資料載入到Ignite儲存中,然後對儲存的資料進行線性迴歸。使用Ignite儲存的優點是資料將分佈在整個叢集中,因此將執行分散式訓練。對於大規模資料集,使用Ignite儲存就會有很大的好處。在本例中將把資料載入到Ignite儲存中。
讀取訓練資料和測試資料
需要讀取兩個CSV檔案,一個是訓練資料,一個是測試資料。通過下面的程式碼,可以從CSV檔案中讀取資料:
private static void loadData(String fileName, IgniteCache<Integer, HouseObservation> cache)
throws FileNotFoundException {
Scanner scanner = new Scanner(new File(fileName));
int cnt = 0;
while (scanner.hasNextLine()) {
String row = scanner.nextLine();
String[] cells = row.split(",");
double[] features = new double[cells.length - 1];
for (int i = 0; i < cells.length - 1; i++)
features[i] = Double.valueOf(cells[i]);
double price = Double.valueOf(cells[cells.length - 1]);
cache.put(cnt++, new HouseObservation(features, price));
}
}
該程式碼簡單地一行行的讀取資料,然後對於每一行,使用CSV的分隔符拆分出欄位,每個欄位之後將轉換成double型別並且存入Ignite。
將訓練資料和測試資料存入Ignite
前面的程式碼將資料存入Ignite,要使用這個程式碼,首先要建立Ignite儲存,如下:
IgniteCache<Integer, HouseObservation> trainData = ignite.createCache("BOSTON_HOUSING_TRAIN");
IgniteCache<Integer, HouseObservation> testData = ignite.createCache("BOSTON_HOUSING_TEST");
使用訓練資料建立線性迴歸模型
資料儲存之後,可以像下面這樣建立訓練器:
DatasetTrainer<LinearRegressionModel, Double> trainer = new LinearRegressionLSQRTrainer();
然後擬合訓練資料,如下:
LinearRegressionModel mdl = trainer.fit(
ignite,
trainData,
(k, v) -> v.getFeatures(),
// Feature extractor.
(k, v) -> v.getPrice()
// Label extractor.
Ignite將資料儲存為鍵-值(K-V)格式,因此上面的程式碼使用了值部分,目標值是Price,而特徵位於其他列中。
將模型應用於測試資料
下一步,就可以用訓練好的線性模型測試測試資料了,在Ignite的機器學習路線圖中,有計劃提供內建的得分計算器,但是就目前來說,可以這樣做:
double meanPrice = getMeanPrice(testData);
double u = 0, v = 0;
try (QueryCursor<Cache.Entry<Integer, HouseObservation>> cursor = testData.query(new ScanQuery<>())) {
for (Cache.Entry<Integer, HouseObservation> testEntry : cursor) {
HouseObservation observation = testEntry.getValue();
double realPrice = observation.getPrice();
double predictedPrice = mdl.apply(new DenseLocalOnHeapVector(observation.getFeatures()));
u += Math.pow(realPrice - predictedPrice, 2);
v += Math.pow(realPrice - meanPrice, 2);
}
}
這裡計算的是殘差平方和(U)和總平方和(V)。
確定模型的R2得分
可以發現,R2的值為1 - u / v:
double score = 1 - u / v;
System.out.println("Score : " + score);
輸出值為0.7450194305206714,或者74.5%,這與之前的值相同。
總結
Apache Ignite提供了一個機器學習演算法庫。通過線性迴歸示例,可以看到建立模型、測試模型和確定模型的R2得分的簡單性,也可以用這個模型來做預測。
目前,可用的機器學習工具有很多,但它們不能多節點擴充套件,只能處理少量資料。相比之下,Ignite所帶來的好處是它有能力擴充套件下面兩種能力:
叢集的大小(成百上千臺機器)
儲存的資料量(GB、TB甚至PB級資料)
因此,Ignite可以大規模地執行機器學習。它可以以分散式處理的方式,對大資料進行真正的機器學習管理。