監督學習 概念: 在有標記的樣本(labels samples)上建立機器學習 1、數據的預處理 機器學習演算法無法理解原始數據,所以需對原始數據進行預處理,常用預處理如下: 預處理主要使用了preprocessing包,所以需對該包進行導入: import numpy as np from skle ...
監督學習
概念:在有標記的樣本(labels samples)上建立機器學習
1、數據的預處理
機器學習演算法無法理解原始數據,所以需對原始數據進行預處理,常用預處理如下:
預處理主要使用了preprocessing包,所以需對該包進行導入:
import numpy as np
from sklearn import preprocessing
data=np.array([
[3,-1.5,2,-5.4],
[0,4,-0.3,2.1],
[1,3.3,-1.9,-4.3]
])
1.1均值移除(Mean removal)
#將特征數據的分佈調整成標準正太分佈,也叫高斯分佈,
#也就是使得數據的均值維0,方差為1.標準化是針對每一列而言的
#方法一
data_standardized=preprocessing.scale(data)
print('Mean=',data_standardized.mean(axis=0))#特征均值幾乎為0
print('Std=',data_standardized.std(axis=0))#標準差為1
#方法二
scaler=preprocessing.StandardScaler().fit(data)
print('Mean=',scaler.transform(data).mean(axis=0))#特征均值幾乎為0
print('Std=',scaler.transform(data).std(axis=0))#標準差為1
1.2範圍縮放(Scaling)
#為了對付那些標準差相當小的特征並且保留下稀疏數據中的0值
#方法一:計算公式如下:
#X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
#X_scaled = X_std / (max - min) + min
data_minmax_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_minmax_scaler.fit_transform(data)
print("Min max scaled data:", data_scaled)
#方法二:特征中絕對值最大的那個數為1,其他數以此維標準分佈在[[-1,1]之間
max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxsbs = max_abs_scaler.fit_transform(data)
print("Max abs scaled data:", x_train_maxsbs)
1.3歸一化(Normalization)
# 正則化:保證每個特征向量的值都縮放到相同的數值範圍內,
#提高不同特征特征數據的可比性,如數據有許多異常值可使用此方法
#方法一:第二個參數可謂l1與l2,最常用為調整到l1範數,使所有特征向量之和為1
data_normalized = preprocessing.normalize(data, norm='l1')
print("\nL1 normalized data:\n", data_normalized)
#方法二:
normalizer = preprocessing.Normalizer(copy=True, norm='l2').fit(data)#創建正則器
normalizer.transform(data)
1.4二值化(Binarization)
# 將數值型的特征數據轉換成布爾類型的值
# 方法一
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)#比1.4大的為1,小的為0
print("\nBinarized data:\n", data_binarized)
#方法二:
binarizer = preprocessing.Binarizer(threshold=0)
print("\nBinarized data:\n", binarizer.transform(data))
1.5獨熱編碼(One-Hot Encoding)
# http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
encoder = preprocessing.OneHotEncoder()
encoder.fit([[0, 2, 1, 12], [1, 3, 5, 3], [2, 3, 2, 12], [1, 2, 4, 3]])
encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray()
print("Encoded vector:", encoded_vector)
print("_values_:", encoder.n_values_)#值的每個特征的最大數量。
print("Encoded vector:", encoder.feature_indices_)
1.6彌補缺失值
imp = preprocessing.Imputer(missing_values='NaN', axis=0)#NaN可換成其他
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
x = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(x))#填入(1+7)/2和(2+3+6)/3
1.7.生成多項式的特征
# 生成多項式的特征,得到高階相互作用特征
poly = preprocessing.PolynomialFeatures(2)# 創建2次方的多項式
print(poly.fit_transform(data))
1.8.定製變壓器
#定製變壓器:輔助數據清洗或處理
transformer = preprocessing.FunctionTransformer(np.log1p)
print(transformer.transform(np.array([[0, 1], [2, 3]])))
參考文獻:http://blog.csdn.net/sinat_33761963/article/details/53433799
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing
Python機器學習經典實例
2、標記編碼
概念:把單詞標記轉換成數值形式,讓演算法懂得如何操作標記。
# 1、定義一個標記編碼器(label encoder)
label_encoder=preprocessing.LabelEncoder()
# 2、給出標記
input_classes=['abc','egf','opq','rst','bcd','cde']
# 3、為標記編碼,按第一個字母順序為標記排編號,從0開始
label_encoder.fit(input_classes)
for i,item in enumerate(label_encoder.classes_):
print(item,'->',i)
# 4、轉換標記,將給出的標記變為排序標號
label=['rst','opq','abc','rst','opq','abc']
encoded_labels=label_encoder.transform(label)
print(label,encoded_labels)
# 5、反轉標記,將給出的數字,對應出標記
encoded_label=[4,3,2,4,1]
labels=label_encoder.inverse_transform(encoded_label)
print(encoded_label,labels)
3、線性回歸器
import numpy as np
# 創建線性回歸器 目的:提取輸入變數與輸出變數的關聯線性模型,可以使得實際輸出與線性方程預
# 測的輸出的差平方和(sum of squares of differences)最小化,該方法稱普通最小二乘法(Ordinary Least Squares,OLS)
# 1、獲取數據並解析數據到變數X和Y中
X=[]
Y=[]
with open('data_singlevar.txt','r') as f:
for line in f.readlines():
data = [float(i) for i in line.split(',')]
xt,yt=data[:-1],data[-1]
X.append(xt)
Y.append(yt)
# 2、將數據分為訓練集和測試集,各為80%,20%
num_training=int(0.8*len(X))
num_test=len(X)-num_training
X_training=np.array(X[0:num_training])
Y_training=np.array(Y[0:num_training])
X_test=np.array(X[num_training:])
Y_test=np.array(Y[num_training:])
# 3、創建回歸器對象
from sklearn import linear_model
linear_regressor=linear_model.LinearRegression()
linear_regressor.fit(X_training,Y_training)#訓練
# 4、獲取預測數據,並將其顯示
import matplotlib.pyplot as plot
y_train_pred=linear_regressor.predict(X_training)
plot.figure()
plot.scatter(X_training,Y_training,color='green')
plot.plot(X_training,y_train_pred,color='black')
plot.title('數據顯示')
plot.show()
# 5、驗證測試數據,並顯示
y_test_pred=linear_regressor.predict(X_test)
plot.figure()
plot.scatter(X_test,Y_test,color='green')
plot.plot(X_test,y_test_pred,color='black')
plot.title('數據顯示')
plot.show()
4、計算回歸準確性
評價回歸器的擬合效果,簡述幾個衡量回歸器效果的重要指標(metric):
- 平均絕對誤差(mean absolute error):所有數據點的絕對誤差平均值。
- 均方誤差(mean squared error):所有點的誤差的平方的平均值(常用)。
- 中位數軍隊誤差(median absolute error):所有點的誤差的中位數。優點是可以消除異常值的干擾
- 解釋方差分(explained variance acore):用於衡量模型對數據集波動的解釋能力。
R方得分(R2 score):確定性關係繫數,用於衡量模型對未知樣本預測的效果,最好1.0,值也可負數。
scikit-learn裡面有一塊模塊,提供了計算所有指標的功能。import sklearn.metrics as sm print('平均絕對誤差:',round(sm.mean_absolute_error(Y_test,y_test_pred))) print('均方誤差:',round(sm.mean_squared_error(Y_test,y_test_pred))) print('中位數絕對誤差:',round(sm.median_absolute_error(Y_test,y_test_pred))) print('解釋方差分:',round(sm.explained_variance_score(Y_test,y_test_pred))) print('R方得分:',round(sm.r2_score(Y_test,y_test_pred)))
通常儘量保證均方誤差最低,而解釋方差分最高
5、保存模型
模型訓練結束之後,為下次使用方便,可以保存模型。
# 保存模型
import pickle as p
with open('saved_model_output.pkl','wb') as f:
p.dump(linear_regressor,f)
#載入模型,載入的便是linear_regressor
with open('saved_model_output.pkl','rb') as f:
model_liner=p.load(f)
y_pre=model_liner.predict(X_test)
6、嶺回歸器
普通最小二乘法在建模時會考慮異常值的影響,所以使得模型不是最優,這裡引入正則化項的繫數作為闕值來消除異常值影響,該方法稱嶺回歸。
#alpha趨於0時,嶺回歸器就是普通最小乘法的線性回歸器,若希望對異常值不敏感,設為大一點
ridge_regressor=linear_model.Ridge(alpha=1,fit_intercept=True,max_iter=10000)
ridge_regressor.fit(X_training,Y_training)
y_test_pred_ridge=ridge_regressor.predict(X_test)
plot.figure()
plot.scatter(X_test,Y_test,color='green')
plot.plot(X_test,y_test_pred_ridge,color='black')
plot.title('train數據顯示')
plot.show()
print('平均絕對誤差:',round(sm.mean_absolute_error(Y_test,y_test_pred_ridge)))
print('均方誤差:',round(sm.mean_squared_error(Y_test,y_test_pred_ridge)))
print('中位數絕對誤差:',round(sm.median_absolute_error(Y_test,y_test_pred_ridge)))
print('解釋方差分:',round(sm.explained_variance_score(Y_test,y_test_pred_ridge)))
print('R方得分:',round(sm.r2_score(Y_test,y_test_pred_ridge)))
7、創建多項式回歸器
若數據中帶有曲線,線性模型不能捕捉到,因為線性回歸模型只能擬合直線;所以這裡可通過擬合多項式方程來剋服這類問題,提高模型的準確性,但是隨著曲線率增加,使得擬合速度變慢,所以曲線率的大小需綜合考量。
# 創建多項式回歸器
quadratic_featurizer = preprocessing.PolynomialFeatures(degree=5)#獲取多項式對象,degree的值越大,模型的越準確
X_train_quadratic = quadratic_featurizer.fit_transform(X_training)#獲得多項式形式的輸入
xx=np.linspace(-6,4,100)#曲線顯示
regressor_quadratic = linear_model.LinearRegression()
regressor_quadratic.fit(X_train_quadratic, Y_training)
xx_quadratic = quadratic_featurizer.fit_transform(xx.reshape(xx.shape[0], 1))#獲得多項式形式的輸入
yy_pre=regressor_quadratic.predict(xx_quadratic)#獲取預測值
plot.figure()
plot.scatter(X_training,Y_training,color='green')
plot.plot(xx,yy_pre , 'r-')
plot.title('train數據顯示')
plot.show()
8、例子
1.估算房屋價格
使用帶AdaBoost演算法的決策樹回歸器(decision tree regressor)。決策樹是一個樹裝模型,每一個節點都做出一個決策,從而影響最終結果,葉子節點表示輸出數值,分支表示根據輸入特征做出的中間決策。AdaBoost演算法是指自適應增強(adaptive boosting)演算法,這是一種利用其它系統增強模型準確性的技術。這種技術是將不同版本的演算法結果進行組合,用加權彙總的方式獲得最終結果,被稱為弱學習器*(weak learners).使用詳細例子如下:
# 估算房屋價格
import numpy as np
from sklearn import datasets
from sklearn.utils import shuffle
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error,explained_variance_score
import matplotlib.pyplot as plt
# 1、獲取標準房屋價格資料庫,scikit-learn提供介面
housing_data=datasets.load_boston()
# 2、將數據分入到X,Y中,並通過shuffle打亂數據,random_state控制如何打亂順序
X,y=shuffle(housing_data.data,housing_data.target,random_state=7)
# 3、80%訓練數據,20%測試數據
num_training=int(0.8*len(X))
X_train,y_train=X[0:num_training],y[0:num_training]
X_test,y_test=X[num_training:],y[num_training:]
# 4、擬合決策樹模型,並限制最大深度為4
dt_regressor=DecisionTreeRegressor(max_depth=4)
dt_regressor.fit(X_train,y_train)
# 5、用帶AdaBoost演算法
ab_regressor=AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),n_estimators=400,random_state=4)
ab_regressor.fit(X_train,y_train)
# 6、評估決策樹模型測試結果,儘量保證均方誤差最低,而解釋方差分最高
y_dt_pred=dt_regressor.predict(X_test)
print('均方差:',mean_squared_error(y_test,y_dt_pred))
print('解釋方差:',explained_variance_score(y_test,y_dt_pred))
# 7、評估AdaBoost測試結果,同上
y_ab_pred=ab_regressor.predict(X_test)
print('均方差:',mean_squared_error(y_test,y_ab_pred))
print('解釋方差:',explained_variance_score(y_test,y_ab_pred))
def plot_feature_importances(feature_importances,title,feature_names):
feature_importances=100*(feature_importances/max(feature_importances))
index_sorted=np.flipud(np.argsort(feature_importances))#argsort獲得數值從小到大排序的索引,flipud反序
pos=np.arange(index_sorted.shape[0])+0.5
plt.figure()
plt.bar(pos,feature_importances[index_sorted],align='center')
plt.xticks(pos,feature_names[index_sorted])
plt.title(title)
plt.show()
plot_feature_importances(dt_regressor.feature_importances_,'dt',housing_data.feature_names)
plot_feature_importances(ab_regressor.feature_importances_,'dt',housing_data.feature_names)
2.評估共用單車
採用隨機森立回歸器(random forest regressor);隨機森林是一個決策樹集合,基本上是用一組有數據集的若幹子集構建的決策樹構成,再用決策樹平均值改善整體學習效果。使用例子如下:
# 評估共用單車重要因素
import csv
from sklearn.ensemble import RandomForestRegressor
# 1、讀取數據,該數據是從文件中讀取
def load_datasets(filename):
file_reader=csv.reader(open(filename,'r'),delimiter=',')
X=[]
y=[]
for row in file_reader:
X.append(row[2:13])
y.append(row[-1])
feature_name=np.array(X[0])
return np.array(X[1:]).astype(np.float32),np.array(y[1:]).astype(np.float32),feature_name
# 2、獲取數據並將文件打亂放入X,y中
X,y,feature_name=load_datasets('bike_day.csv')
X,y=shuffle(X,y,random_state=7)
# 3、將數據分成0.9訓練和0.1的測試數據
num_training=int(len(X)*0.9)
X_train,y_train=X[:num_training],y[:num_training]
X_test,y_test=X[num_training:],y[num_training:]
# 4、訓練回歸
# #n_estimators指評估器的數量,則決策樹數量,min_samples_split指決策樹分裂一個節點需要用到的最小數據樣本量
rf_regressor=RandomForestRegressor(n_estimators=1000,max_depth=10,min_samples_split=2)
rf_regressor.fit(X_train,y_train)
# 5、評價隨機森林回歸的效果
y_pre=rf_regressor.predict(X_test)
print('均方差:',mean_squared_error(y_test,y_pre))
print('解釋方差:',explained_variance_score(y_test,y_pre))
plot_feature_importances(rf_regressor.feature_importances_,'rf',feature_name)