機器學習--Logistic Regression(scikit-learn_ 預測疝氣病症病馬死亡率問題)

據說,心情不好的時候,整理東西可以讓好心情迴歸,那麼同理,懶散得想要沉淪時候,總結知識可以召回學習的神龍。

學習回顧:

認識sklearn:scikit-learn,Python庫之一,Scipy(Scientific Python,Python科學計算)工具集的一部分,該庫整合了多種機器學習算法,因此可用scikit-learn庫實現機器學習,可用來預測模型的創建和驗證。

scikit-learn的所有模型都被稱作有監督估計器,訓練估計器要用到fit(x,y)函數,其中x指觀察到的特徵,y指的是目標。估計器經過訓練後,可以預測任何標籤未知的新數據x的y指,其中預測是通過predict(x)函數完成

練習機器學習算法,沒有現成數據的可以用Iris數據集

1、認識iris數據集:

#導入
from sklearn import datasets
#鳶尾花卉數據集的所有數據和元數據(注1)都加載到iris變量中
iris = datasets.load_iris()

注1:元數據
數據是指實際數據,而元數據指描述數據的數據,描述一個數據特徵的系統數據,如訪問權限、存儲位置、文件擁有者等……

#使用iris變量的data屬性,查看所含數據
iris.data
#150個 元素,每個元素四個數值
Out[3]: 
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 5.4,  3.9,  1.7,  0.4],
       [ 4.6,  3.4,  1.4,  0.3],
       [ 5. ,  3.4,  1.5,  0.2],
       [ 4.4,  2.9,  1.4,  0.2],
       [ 4.9,  3.1,  1.5,  0.1],
       [ 5.4,  3.7,  1.5,  0.2],
       [ 4.8,  3.4,  1.6,  0.2],
       [ 4.8,  3. ,  1.4,  0.1]
       ......
       ])
#查看花卉種類
iris.target
Out[4]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
#查看花卉類別
iris.target_names
Out[5]: 
array(['setosa', 'versicolor', 'virginica'],
      dtype='<U10')
#0代表Setosa  1代表Versicolour   2代表 Virginica
#散點圖
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from sklearn import datasets

iris = datasets.load_iris()
x = iris.data[:,3]#萼片長度(數據集第四列元素賦值給變量x)
y = iris.data[:,2]#寬度
#可更改查看區別,當長度爲第四列,寬度爲第三列時效果最明顯

#花卉類別
target = iris.target

#計算散點圖x軸最小值,最大值
x_min,x_max = x.min() - 0.5,x.max()+0.5
y_min,y_max = y.min() - 0.5,y.max()+0.5

plt.figure()
plt.title("Iris dataset classification",size = 15)
plt.scatter(x,y,c=target)
plt.xlable("length")
plt.ylabel("width")
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.xticks(())
plt.yticks(())
plt.plot()

#保存爲png圖片
plt.savefig('iris.png')  

plt.show()  

這裏寫圖片描述

更多練習可參考:
http://blog.csdn.net/sileixinhua/article/details/70477303

2、scikit-learn中的metrics以及logistic預測疝氣病症病馬死亡率問題
(參考《機器學習實戰》)

from sklearn import linear_model
from sklearn import metrics
from sklearn.metrics import accuracy_score

#訓練集 
frtrain = open('horseColicTraining.txt')
train_data = []
train_target = []
for line in frtrain.readlines():
    lineArr = line.strip().split('\t')
    train_data.append([float(inst) for inst in lineArr[:-1]])
    train_target.append(float(lineArr[-1]))

#測試集
frtest = open('horseColicTest.txt')
test_data = []
test_target = []
for line in frtest.readlines():
    lineArr = line.strip().split('\t')
    test_data.append([float(inst) for inst in lineArr[:-1]])
    test_target.append(float(lineArr[-1]))

#利用logistic迴歸模型訓練數據
clf = linear_model.LogisticRegression()
clf = clf.fit(train_data,train_target)

predicted=clf.predict(test_data)
expected=test_target 
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))
print('The accuracy of logistic is :',accuracy_score(test_target,predicted))
             precision    recall  f1-score   support

        0.0       0.54      0.65      0.59        20
        1.0       0.84      0.77      0.80        47

avg / total       0.75      0.73      0.74        67

[[13  7]
 [11 36]]
The accuracy of logistic is : 0.731343283582

2.2、函數實現
可以發現測試集和訓練集的操作雷同,所以用函數實現,更方便

from sklearn import linear_model
from sklearn import metrics
from sklearn.metrics import accuracy_score

def loadData(filename):
    fr = open(filename).readlines()
    data = []
    target = []
    for line in fr:
        lineArr = line.strip().split('\t')
        data.append([float(inst) for inst in lineArr[:-1]])
        target.append(float(lineArr[-1]))
    return data,target

train_data,train_target = loadData('horseColicTraining.txt')
test_data,test_target = loadData('horseColicTest.txt')

clf = linear_model.LogisticRegression()
clf = clf.fit(train_data,train_target)

predicted=clf.predict(test_data)
expected=test_target 
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))
print('The accuracy of logistic is :',accuracy_score(test_target,predicted))

結果相同:

             precision    recall  f1-score   support

        0.0       0.54      0.65      0.59        20
        1.0       0.84      0.77      0.80        47

avg / total       0.75      0.73      0.74        67

[[13  7]
 [11 36]]
The accuracy of logistic is : 0.731343283582

錯誤回顧:

問題1:

TypeError: Cannot cast array data from dtype('float64') to dtype('<U32') according to the rule 'safe'

解決思路:

result = [float(i) for i in list]

問題2:

'range' object doesn't support item deletion

原因:
python3.x range返回的是range對象,不返回數組對象
解決思路:
data = range(m) 改爲 data = list(range(m))

問題3:

Could not convert string to float:’young’

原因:
fit函數不支持字符串形式

思路:
運用pandas庫的數據類型進行轉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章