分類演算法實例一:用Logistic演算法進行乳腺癌數據分類
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd import warnings import sklearn from sklearn.linear_model import LogisticRegressionCV,LinearRegression from sklearn.linear_model.coordinate_descent import ConvergenceWarning from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 設置字符集,防止中文亂碼 mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False # 攔截異常 warnings.filterwarnings(action = 'ignore', category=ConvergenceWarning) # 數據讀取並處理異常數據 path = "datas/breast-cancer-wisconsin.data" names = ['id','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape', 'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei', 'Bland Chromatin','Normal Nucleoli','Mitoses','Class'] df = pd.read_csv(path, header=None, names=names) # 只要有列為空,就進行刪除操作 datas = df.replace('?', np.nan).dropna(how = 'any') # 顯示前5條數據 datas.head(5)
# 1. 數據提取以及數據分隔 # 數據提取 X = datas[names[1:10]] Y = datas[names[10]] # 數據分隔 X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.1,random_state=0) # 2. 數據格式化(歸一化數據) ss = StandardScaler() X_train = ss.fit_transform(X_train) # 3. 模型構建及訓練 # penalty:過擬合解決參數,取值l1或者l2 # solver:參數優化方式 # 當penalty為l1的時候,參數只能是:liblinear(坐標軸下降法) # nlbfgs和cg都是關於目標函數的二階泰勒展開 # 當penalty為l2的時候,參數可以是:lbfgs(擬牛頓法)、newton-cg(牛頓法變種)、seg(minibatch) # 維度<10000時,lbfgs法比較好,維度>10000時,cg法比較好,顯示卡計算的時候,lbfgs和cg都比seg快 # multi_class:分類方式參數;參數可選:ovr(默認)、multinomial;這兩種方式在二元分類問題中,效果是一樣的;在多元分類問題中,效果不一樣 # ovr:one-vs-rest, 對於多元分類的問題,先將其看做二元分類,分類完成後,再迭代對其中一類繼續進行二元分類 # multinomial:many-vs-many(MVM),對於多元分類問題,如果模型有T類,我們每次在所有的T類樣本裡面選擇兩類樣本出來 # 不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負例,進行二元邏輯回歸,得到模型參數。我們一共需要T(T-1)/2次分類 # class_weight:特徵權重參數 # Logistic回歸是一種分類演算法,不能應用於回歸中(也即是說對於傳入模型的y值來講,不能是float類型,必須是int類型) lr = LogisticRegressionCV(multi_class='ovr', fit_intercept=True, Cs=np.logspace(-2, 2, 20), cv=2, penalty='l2', solver='lbfgs', tol=0.01) re = lr.fit(X_train, Y_train) # 4. 模型效果獲取 r = re.score(X_train, Y_train) print("R值(準確率):", r) print("稀疏化特徵比率:%.2f%%" % (np.mean(lr.coef_.ravel() == 0) * 100)) print("參數:",re.coef_) print("截距:",re.intercept_) print(re.predict_proba(X_test))
# 5. 模型相關資訊保存 # 引入包 from sklearn.externals import joblib # 將標準化模型保存,要求文件夾必須存在 joblib.dump(ss, "datas/logistic/ss.model") # 將模型保存,要求文件夾必須存在 joblib.dump(lr, "datas/models/logistic/lr.model") # 6. 模型載入 # 引入包 from sklearn.externals import joblib oss = joblib.load("models/logistic/ss.model") olr = joblib.load("models/logistic/lr.model") # 數據預測 # a. 預測數據格式化(歸一化) X_test = ss.transform(X_test) # 使用模型進行歸一化操作 # b. 結果數據預測 Y_predict = re.predict(X_test) # c. 圖表展示 x_len = range(len(X_test)) plt.figure(figsize=(14,7), facecolor='w') plt.ylim(0,6) plt.plot(x_len, Y_test, 'ro',markersize = 8, zorder=3, label=u'真實值') plt.plot(x_len, Y_predict, 'go', markersize = 14, zorder=2, label=u'預測值,$R^2$=%.3f' % re.score(X_test, Y_test)) plt.legend(loc = 'upper left') plt.xlabel(u'數據編號', fontsize=18) plt.ylabel(u'乳腺癌類型', fontsize=18) plt.title(u'Logistic回歸演算法對數據進行分類', fontsize=20) plt.show()