模仿sklearn進行機器學習演算法的封裝
程式碼中用到的公式
#每一個Class分別在一個單獨的py檔案下
#KNN.py
import numpy as np
from math import sqrt
from collections import Counter
class KNNClassifier:
def __init__(self,k):
#建構函式
"""初始化KNN分類器"""
assert k >= 1,"k must be valid"
self.k = k
#加下劃線,表明是私有的成員變數
self.k = k
self._X_train = None
self._y_train = None
def fit(self,X_train,y_train):
"""根據訓練集X_train和y_train訓練kNN分類器"""
assert X_train.shape[0] == y_train.shape[0],
"the size of X_train must be equal to the size of y_train"
assert self.k <= X_train.shape[0],
"the size of X_train must be at least k."
self._X_train = X_train
self._y_train = y_train
return self
#Sklearn 要求使用者輸入給預測模型的資料型別是二維矩陣
#SKlearn 返回的結果型別是np.array
def predict(self,X_predict):
"""給定待預測資料集X_predict,返回表示X_predict的結果向量"""
assert self._X_train is not None and self._y_train is not None,
"must fit before predict!"
assert X_predict.shape[1] == self._X_train.shape[1],
"the feature number of X_predict must be equal to X_train"
y_predict = [self._predict(x) for x in X_predict]
return np.array(y_predict)
#私有的predict函式
def _predict(self,x):
"""給定單個待預測資料x,返回x的預測結果值"""
assert x.shape[0] == self._X_train.shape[1],
"the feature number of x must be equal to X_train"
#計算距離
distances = [
sqrt(np.sum((x_train - x) ** 2))
for x_train in self._X_train
]
#對距離進行排序
nearest = np.argsort(distances)
topK_y = [self._y_train[i] for i in nearest[:self.k]]
#投票
votes = Counter(topK_y)
return votes.most_common(1)[0][0]
def __repr__(self):
return "KNN(k = %d)" % self.k
#KNN.py的用法:
"""
1.基本用法
knn_clf = KNNClassifier(k = 6)
knn_clf.fit(X_train,y_train)
y_predict = knn_clf.predict(X_predict)
"""
"""
2.使用網格搜尋來對KNN進行調參
#先對需要調參的超引數建立一個字典
param_grid = [
{
'weights':['uniform'],
'n_neighbors':[i for i in range(1,11)]
},
{
'weights':['distance'],
'n_neighbors':[i for i in range(1,11)],
'p': [i for i in range(1,6)]
}
]
knn_clf = KNNClassifier(k = 6)
knn_clf.fit(X_train,y_train)
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(knn_clf,param_grid)
#使用grid_search來fit
grid_search.fit(X_train,y_train)
#過程比較耗時
grid_search.best_estimator_
#返回最佳模型對應的超引數
grid_search.best_score_
#返回最佳模型的評分
grid_search.best_params_
#返回最佳引數
knn_clf = grid_search.best_estimator_
#拿到最佳引數對應的分類器
y_predict = knn_clf.predict(X_test)
"""
#model_selection.py
import numpy as np
def train_test_split(X,y,test_ratio = 0.2,seed = None):
assert X.shape[0] == y.shape[0],
"the size of X must be equal to the size of y"
assert 0.0 <= test_ratio <= 1.0,
"test_ration must be valid"
#如果Seed不為空
if seed:
np.random.seed(seed)
shuffled_indexes = np.random.permutation(len(X))
#np.random.permutation(len(x))
#permutation:返回的是一個Array,這個Array是x的索引的隨機排列
test_size = int(len(X) * test_ratio)
test_indexes = shuffled_indexes[:test_size]
train_indexes = shuffled_indexes[test_size:]
X_train = X[train_indexes]
y_train = y[train_indexes]
X_test = X[test_indexes]
y_test = y[test_indexes]
return X_train,X_test,y_train,y_test
#基於正規方程的多元線性迴歸
#LinearRegression.py
import numpy as np
from sklearn.metrics import r2_score
class LinearRegression:
def __init__(self):
"""初始化Linear Regression模型"""
self.coef_ = None
self.interception_ = None
self._theta = None
#訓練過程
def fit_normal(self,X_train,y_train):
assert X_train.shape[0] == y_train.shape[0],
"the size of X_train must be equal to the size of y_train"
X_b = np.hstack([np.ones((len(X_train),1)),X_train])
#正規方程
#求矩陣的逆 : np.linalg.inv
self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
#截距
self.interception_ = self._theta[0]
#權重
self.coef_ = self._theta[1:]
return self
#預測過程
def predict(self,X_predict):
"""給定待預測資料集X_predict,返回表示X_predict的結果向量"""
assert self.intercept_ is not None and self.coef_ is not None,
"must fit before predict!"
assert X_predict.shape[1] == len(self.coef_),
"the feature number of X_predict must be equal to X_train"
X_b = np.hstack([np.ones((len(X_predict),1)),X_predict])
return X_b.dot(self._theta)
def score(self,X_test,y_test):
y_predict = self.predict(X_test)
return r2_score(y_test,y_predict)
def __repr__(self):
return "LinearRegression()"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2822867/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 機器學習Sklearn系列:(五)聚類演算法機器學習聚類演算法
- Python機器學習筆記:sklearn庫的學習Python機器學習筆記
- 機器學習 第4篇:sklearn 最鄰近演算法概述機器學習演算法
- 機器學習入門之sklearn介紹機器學習
- 機器學習Sklearn系列:(三)決策樹機器學習
- 機器學習1-sklearn&字典特徵抽取機器學習特徵
- 機器學習|決策樹-sklearn實現機器學習
- 【機器學習】線性迴歸sklearn實現機器學習
- 機器學習實戰 | SKLearn最全應用指南機器學習
- 基於Sklearn機器學習程式碼實戰機器學習
- 機器學習之支援向量機原理和sklearn實踐機器學習
- 【機器學習】多項式迴歸sklearn實現機器學習
- 機器學習Sklearn系列:(四)樸素貝葉斯機器學習
- 機器學習之決策樹在sklearn中的實現機器學習
- 機器學習-訓練模型的儲存與恢復(sklearn)機器學習模型
- 如何進行機器學習框架選擇機器學習框架
- 機器學習神經網路——Sklearn.neural_network概要機器學習神經網路
- 機器學習之使用sklearn構造決策樹模型機器學習模型
- 機器學習之決策樹原理和sklearn實踐機器學習
- 【機器學習】新手必看的十種機器學習演算法機器學習演算法
- 【2】使用MATLAB進行機器學習(迴歸)Matlab機器學習
- Java學習-封裝Java封裝
- 機器學習演算法機器學習演算法
- 用Python進行機器學習(附程式碼、學習資源)Python機器學習
- 深度學習演算法:從模仿到創造深度學習演算法
- 讓機器人看一眼就能模仿:One-Shot模仿學習發展情況機器人
- 機器人想要什麼:利用機器學習有效地進行教學機器人機器學習
- 機器學習演算法學習筆記機器學習演算法筆記
- 機器學習演算法:AdaBoost機器學習演算法
- Python遷移學習:機器學習演算法Python遷移學習機器學習演算法
- TensorFlow.NET機器學習入門【8】採用GPU進行學習機器學習GPU
- 從 0 開始機器學習 - 機器學習演算法診斷機器學習演算法
- 利用sklearn進行字典&文字的特徵提取特徵
- 小程式API進行promise封裝APIPromise封裝
- vue中對axios進行封裝VueiOS封裝
- 利用機器學習進行惡意程式碼分類機器學習
- 【機器學習】機器學習建立演算法第1篇:機器學習演算法課程定位、目標【附程式碼文件】機器學習演算法
- 17個機器學習的常用演算法機器學習演算法