ML机器学习基础的编程技巧:
目錄
一、One_hot編碼:(邏輯回歸or神經網絡)?
二、評估classificaition_report
三、序列化&解序列化
四、神經網絡的隨機初始化
? ? ?五、特征值映射 Feature-mapping
六、特征值縮放->歸一化和標準化
七、Learning Curve學習曲線->判斷high bia/var?
八、數據的訓練集、交叉驗證集、測試集的應用:
九、支持向量機svm的使用
十、利用meshgrid與contour繪制二維高階的決策邊界
十一、K-means算法
十二、PCA降維
十三、異常檢測
一、One_hot編碼:(邏輯回歸or神經網絡)
?二、評估classificaition_report
?三、序列化&解序列化
?四、神經網絡的隨機初始化
五、特征值映射 Feature-mapping
def feature_mapping(x1,x2,power):data={} #建立一個空字典for i in np.arange(power+1):for j in np.arange(i+1):data['F{}{}'.format(i-j,j)]=np.power(x1,i-j)*np.power(x2,j)return pd.DataFrame(data)六、特征值縮放->歸一化和標準化
?場景一:有訓練集train、交叉驗證集cv和測試集test.
? ? ? ? 一般只需要訓練集的mean和std即可
? ? ? ? ? ? ? ? ->why:
? ? ? ? ?注意:不同特征mean和std是需要進行分別去求的,不能夠混合求
七、Learning Curve學習曲線->判斷high bia/var
八、數據的訓練集、交叉驗證集、測試集的應用:
用交叉驗證集選擇最佳lambda
# 用交叉驗證集選擇lmd lamdas = [0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10] training_cost = [] cv_cost = [] for lamda in lamdas:res = train_model(X_train_norm, y_train, lamda)tc = reg_cost(res, X_train_norm, y_train, lamda=0)#計算訓練集上的誤差cv = reg_cost(res, X_val_norm, y_val, lamda=0)#計算驗證集上的誤差training_cost.append(tc)cv_cost.append(cv)plt.plot(lamdas, training_cost, label='training cost')#不同lamda取值下訓練集的損失 plt.plot(lamdas, cv_cost, label='cv cost') plt.legend() plt.show()#拿到最佳lamda bestLamda = lamdas[np.argmin(cv_cost)] print(bestLamda)#3 #用最佳lamda來訓練測試集 res = train_model(X_train_norm, y_train, bestLamda) print(reg_cost(res, X_test_norm, y_test, lamda=0))#4.3976161577441975由訓練集(帶lambda訓練)得到theta,->通過看何時cv_cost最小,取為bestLambda->用于test集
九、支持向量機svm的使用
from sklearn.svm import SVC①用SVC函數初始化一個對象出來
? ? ? ? 常用參數有:C、kernel、gamma
svc1 = SVC(C=1,kernel='linear')②喂訓練集的X_train與y_train-->擬合參數
? ? ? ? ? ? ? ? 注意y是一維的---flatten降維度操作
svc1.fit(X,y.flatten())③給定X_d預測相關的y
svc1.predict(X)④將原來的X_train與y_train給出--->可以得知準確率
svc1.score(X,y.flatten())補充:尋找最優的C與gamma?
十、利用meshgrid與contour繪制二維高階的決策邊界
1.原理與應用展示
?如上圖,一一組合,構成了網格的一個個坐標(注意y每一行都是相同的元素,x是每一列)
?
?
例1:
x=np.linspace(-1.2,1.2,200) xx,yy=np.meshgrid(x,x)#生成兩個網格(200,200) z=feature_mapping(xx.ravel(),yy.ravel(),6).values z=np.c_[np.ones(z.shape[0]),z] zz=z@theta_final zz=zz.reshape(xx.shape) plt.contour(xx,yy,zz,1)?2.應用:
值得注意的是這邊的np.c_[ ]將兩個flatten()之后的一維數組,變成了(k,2)二維的數組
十一、K-means算法
1.介紹:
?2.具體代碼實現細節:
? ? ? ? ①有關np.linalg.norm()解析
? ? ? ? ②函數:
? ? ? ? ?③初始化聚類點的選取:
def init_centros(X,k):index = np.random.choice(len(X),k)return X[index] #此處仍然利用的是bool索引->隨機選擇出k個坐標3.案例演示:使用kmeans對圖片顏色進行聚類
①RGB圖像,每個像素點值范圍0-255
? ? 圖片的讀取---?
from skimage import io?②用16個聚類重構該圖片:
十二、PCA降維
1.PCA相關簡介
?2.執行步驟
?3.調用numpy的線性代數庫
U,S,V = np.linalg.svd(C)十三、異常檢測
1.算法流程:
?2.具體的細節:
?3.案例代碼:
①獲取訓練集中樣本特征的均值和方差
def estimateGaussian(X,isCovariance):means = np.mean(X,axis=0)if isCovariance:sigma2 = (X-means).T@(X-means) / len(X)else:sigma2 = np.var(X,axis=0)return means,sigma2相同數據兩者的區別:
?注:原高斯分布模型是多元高斯分布模型的一種特殊情況。(如果協方差矩陣只在對角線的單位上有非零的值,即為原本的高斯分布模型)? ? ??
②多元正態分布密度函數
再給出相關實現代碼之前,了解一下np.diag()的使用方法
?(1)對于一個二維矩陣,直接進行了降維操作,只取對角線上的元素.
?(2)對于一個一維矩陣,斜對角線上自動補零,構成二維的矩陣。
def gaussian(X,means,sigma2):if np.ndim(sigma2) == 1:sigma2 = np.diag(sigma2)X = X - meansn = X.shape[1]#X:(307,2) sigma:(2,2) X.T:(2,307)--->(307,307)first = np.power(2*np.pi,-n/2)*(np.linalg.det(sigma2)**(-0.5))second =np.diag(X@np.linalg.inv(sigma2)@X.T) #np.diag操作對象為二維數組,取對角線元素構成新的一維數組(307,)p = first * np.exp(-0.5*second)p = p.reshape(-1,1) #p---->(307,1)# m = len(X) # second = np.zeros(m,1) # for row in range(m): # second[row] = X[row].T @ np.linalg.inv(sigma2) @ X[row] # p = first * np.exp(-0.5*second)return p注意:
? ? ? ? (i)利用np.ndim判斷是否是一個一維數組,是-->將其上升一個維度.(真正變成多元正態分布的一個特殊情況.)
? ? ? ? (ii)np.linalg.det計算行列式的值,np.linalg.inv對一個矩陣取逆
? ? ? ? (iii)second一開始的維度是(307,307)實際上只有對角線上才是對應的p,上面的代碼等效于下面注釋的一塊代碼(用numpy的庫進行矩陣運算可能會更快一點)
③繪圖
def plotGaussian(X,means,sigma2):x = np.arange(0, 30, 0.5) y = np.arange(0, 30, 0.5)xx, yy = np.meshgrid(x,y) z= gaussian(np.c_[xx.ravel(),yy.ravel()], means, sigma2) # 計算對應的高斯分布函數zz = z.reshape(xx.shape) plt.plot(X[:,0],X[:,1],'bx')contour_levels = [10**h for h in range(-20,0,3)]#列表解析, 10的負數次次方-->保證概率在0-1之間plt.contour(xx, yy, zz, contour_levels)④通過F1_score選取最佳的epsilon
def selectThreshold(yval,p):bestEpsilon = 0bestF1 = 0epsilons = np.linspace(min(p),max(p),1000)for e in epsilons:p_ = p < etp = np.sum((yval == 1) & (p_ == 1))fp = np.sum((yval == 0) & (p_ == 1))fn = np.sum((yval == 1) & (p_ == 0))prec = tp / (tp + fp) if (tp+fp) else 0 #細節:防止分母是0!!!----NaNrec = tp / (tp + fn) if (tp+fn) else 0F1_e = 2 * prec * rec / (prec + rec) if (prec + rec) else 0if F1_e > bestF1:bestF1 = F1_ebestEpsilon = ereturn bestEpsilon,bestF1?高維數據的異常檢測:
十四、案例----推薦系統->協同過濾算法:
1.參數的說明與數據的預處理
Y.shape=(1682,943)=R.shape
X.shape=(1682,10)? Theta.shape=(943,10)
注:參數nm-->num of movies? nu-->num of users? nf-->num of features
在編寫cost_function和gradient之前,由于opt.minimize的x0參數必須要傳入一個一維數組,所以寫好序列化參數和解序列化的參數代碼:
def serialize(X,Theta):return np.append(X.flatten(),Theta.flatten()) ##### def deserialize(params,nm,nu,nf):X = params[:nm*nf].reshape(nm,nf)Theta = params[nm*nf:].reshape(nu,nf)return X,Theta2.代價函數與梯度(帶正則)
? ? ? ? ①代價函數
def costFunction(params,Y,R,nm,nu,nf,lamda):X,Theta = deserialize(params,nm,nu,nf)error = 0.5 * np.square((X@Theta.T - Y)* R).sum()#點乘Rreg1 = 0.5 * lamda * np.square(X).sum()reg2 = 0.5 * lamda * np.square(Theta).sum()return error + reg1 + reg2注:點乘R是為了保證是評價過的電影才算入cost中。
##test users = 4 movies = 5 features = 3 X_sub = X[:movies,:features] Theta_sub = Theta[:users,:features] Y_sub = Y[:movies,:users] R_sub = R[:movies,:users] cost1 = costFunction(serialize(X_sub,Theta_sub),Y_sub,R_sub,movies,users,features,lamda = 0) cost1 ##22.224603725685675 def costGradient(params,Y,R,nm,nu,nf,lamda):X,Theta = deserialize(params,nm,nu,nf)X_grad = ((X@Theta.T-Y)*R)@Theta +lamda * XTheta_grad = ((X@Theta.T-Y)*R).T@X + lamda * Thetareturn serialize(X_grad,Theta_grad)(i)注意維度對應
(ii)注意點乘R
3.添加一個新用戶?
my_ratings = np.zeros((nm,1)) my_ratings[9] = 5 my_ratings[66] = 5 my_ratings[96] = 5 my_ratings[121] = 4 my_ratings[148] = 4 my_ratings[285] = 3 my_ratings[490] = 4 my_ratings[599] = 4 my_ratings[643] = 4 my_ratings[958] = 5 my_ratings[1117] = 3Y = np.c_[Y,my_ratings] R = np.c_[R,my_ratings!=0]nm,nu = Y.shapeY.shape=(1682, 944)
4.均值歸一化與參數的初始化
def normalizeRatings(Y,R):Y_mean =(Y.sum(axis=1) / R.sum(axis=1)).reshape(-1,1)Y_norm = (Y - Y_mean) * Rreturn Y_norm,Y_meanY_norm,Y_mean = normalizeRatings(Y,R) X = np.random.random((nm,nf)) Theta = np.random.random((nu,nf)) params = serialize(X,Theta) lamda = 105.訓練模型并預測
#-------訓練模型---------- from scipy.optimize import minimize res = minimize(fun = costFunction,x0 = params,args = (Y_norm,R,nm,nu,nf,lamda),method = 'TNC',jac = costGradient,options = {'maxiter':100}) params_fit = res.x fit_X,fit_Theta = deserialize(params_fit,nm,nu,nf) #---------預測--------- Y_pred = fit_X@fit_Theta.T y_pred = Y_pred[:,-1] + Y_mean.flatten()#預測自己新添加的 index = np.argsort(-y_pred)#默認自小到大,加上一個負號就是反向or在最后加上[::-1] print(index[:10])#array([1466, 1292, 1200, 1499, 1121, 1652, 813, 1598, 1188, 1535])#讀取對應的電影名稱 movies = [] with open('data/movie_ids.txt','r',encoding='latin 1') as f:for line in f:tokens = line.strip().split(' ')movies.append(' '.join(tokens[1:]))print(len(movies))#1682for i in range(10):print(index[i],movies[index[i]],y_pred[index[i]]) ''' 1466 Saint of Fort Washington, The (1993) 5.001810464524898 1292 Star Kid (1997) 5.001694543358842 1200 Marlene Dietrich: Shadow and Light (1996) 5.00149967272587 1499 Santa with Muscles (1996) 5.001334854576942 1121 They Made Me a Criminal (1939) 5.000999967820586 1652 Entertaining Angels: The Dorothy Day Story (1996) 5.000975637072753 813 Great Day in Harlem, A (1994) 5.000799086576183 1598 Someone Else's America (1995) 5.0006016104689905 1188 Prefontaine (1997) 5.000467537343162 1535 Aiqing wansui (1994) 5.000239077425466 '''總結
以上是生活随笔為你收集整理的ML机器学习基础的编程技巧:的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sketch学会这五招,快速提升工作效率
- 下一篇: lisp 墙体 天正建筑_T20天正建筑