分類演算法實例一:用Logistic演算法進行乳腺癌數據分類

  • 2020 年 3 月 18 日
  • 筆記

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()