據說,心情不好的時候,整理東西可以讓好心情迴歸,那麼同理,懶散得想要沉淪時候,總結知識可以召回學習的神龍。
學習回顧:
認識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庫的數據類型進行轉