[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 78

Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Kapitel 8: Maschinelles Lernen

In diesem Kapitel wird die Aufgabe, Sätze mithilfe des Satzpolaritätsdatensatzes v1.0 der von Bo Pang und Lillian Lee veröffentlichten Filmkritikdaten in positive (positive) oder negative (negative) zu klassifizieren (Polaritätsanalyse). Arbeiten Sie daran.

78,5 Teilungskreuztest

Im Experiment> 76-77 wurde der für das Lernen verwendete Fall auch für die Bewertung verwendet, sodass nicht gesagt werden kann, dass es sich um eine gültige Bewertung handelt. Das heißt, der Klassifizierer bewertet die Leistung beim Speichern des Trainingsfalls und misst nicht die Generalisierungsleistung des Modells. Finden Sie daher die richtige Antwortrate, Präzisionsrate, Rückrufrate und F1-Bewertung der Polaritätsklassifizierung durch den 5-Divisions-Kreuztest.

Der fertige Code:

main.py


# coding: utf-8
import codecs
import snowballstemmer
import numpy as np

fname_sentiment = 'sentiment.txt'
fname_features = 'features.txt'
fname_result = 'result.txt'
fencoding = 'cp1252'		# Windows-1252 scheint

division = 5			#Anzahl der Datenabteilungen
learn_alpha = 6.0		#Lernrate
learn_count = 1000		#Anzahl der Lerniterationen

stemmer = snowballstemmer.stemmer('english')

#Liste der Stoppwörter http://xpo6.com/list-of-english-stop-words/Aus dem CSV-Format
stop_words = (
	'a,able,about,across,after,all,almost,also,am,among,an,and,any,are,'
	'as,at,be,because,been,but,by,can,cannot,could,dear,did,do,does,'
	'either,else,ever,every,for,from,get,got,had,has,have,he,her,hers,'
	'him,his,how,however,i,if,in,into,is,it,its,just,least,let,like,'
	'likely,may,me,might,most,must,my,neither,no,nor,not,of,off,often,'
	'on,only,or,other,our,own,rather,said,say,says,she,should,since,so,'
	'some,than,that,the,their,them,then,there,these,they,this,tis,to,too,'
	'twas,us,wants,was,we,were,what,when,where,which,while,who,whom,why,'
	'will,with,would,yet,you,your').lower().split(',')


def is_stopword(str):
	'''Gibt zurück, ob das Zeichen ein Stoppwort ist
Fall ausgleichen

Rückgabewert:
Richtig für Stoppwörter, Falsch für anders
	'''
	return str.lower() in stop_words


def hypothesis(data_x, theta):
	'''Hypothetische Funktion
	data_Verwenden Sie für x Theta für Daten_Vorhersage y

Rückgabewert:
Vorhersagewertmatrix
	'''
	return 1.0 / (1.0 + np.exp(-data_x.dot(theta)))


def cost(data_x, theta, data_y):
	'''Zielfunktion
	data_Berechnen Sie die Differenz zwischen dem vorhergesagten Ergebnis und der richtigen Antwort für x

Rückgabewert:
Unterschied zwischen Vorhersage und korrekter Antwort
	'''
	m = data_y.size			#Anzahl der Daten
	h = hypothesis(data_x, theta)		# data_Vorhersagewertmatrix von y
	j = 1 / m * np.sum(-data_y * np.log(h) -
			(np.ones(m) - data_y) * np.log(np.ones(m) - h))

	return j


def gradient(data_x, theta, data_y):
	'''Berechnung des Gefälles beim steilsten Abstieg

Rückgabewert:
Gradientenmatrix für Theta
	'''
	m = data_y.size			#Anzahl der Daten
	h = hypothesis(data_x, theta)		# data_Vorhersagewertmatrix von y
	grad = 1 / m * (h - data_y).dot(data_x)

	return grad


def extract_features(data, dict_features):
	'''Extrahieren Sie die Identität aus dem Text
Diktieren Sie aus dem Text_Extrahieren Sie die in den Funktionen und enthaltenen Funktionen
	dict_features['(Identität)']Gibt eine Matrix mit der Position 1 zurück.
Das erste Element ist auf 1 festgelegt. Für Gewichte, die nicht der Natur entsprechen.

Rückgabewert:
Das erste Element und die Position der entsprechenden Identität+Matrix mit 1 als 1
	'''
	data_one_x = np.zeros(len(dict_features) + 1, dtype=np.float64)
	data_one_x[0] = 1		#Das erste Element ist fest und 1 für Gewichte, die nicht der Natur entsprechen.

	for word in data.split(' '):

		#Entfernen Sie vorher und nachher leere Zeichen
		word = word.strip()

		#Stoppen Sie die Wortentfernung
		if is_stopword(word):
			continue

		#Stemming
		word = stemmer.stemWord(word)

		#Identitätsindex abrufen, entsprechenden Teil der Matrix auf 1 setzen
		try:
			data_one_x[dict_features[word]] = 1
		except:
			pass		# dict_Ignorieren Sie Funktionen, die nicht in Funktionen enthalten sind

	return data_one_x


def load_dict_features():
	'''features.Lesen Sie txt und erstellen Sie ein Wörterbuch, um die Identität in einen Index umzuwandeln
Der Indexwert basiert auf 1 Features.Entspricht der Zeilennummer in txt.

Rückgabewert:
Ein Wörterbuch, das Identitäten in Indizes konvertiert
	'''
	with codecs.open(fname_features, 'r', fencoding) as file_in:
		return {line.strip(): i for i, line in enumerate(file_in, start=1)}


def create_training_set(sentiments, dict_features):
	'''Erstellen Sie eine zu lernende Matrix und eine Matrix mit polaren Beschriftungen aus den richtigen Antwortdatenstimmungen
Die Größe des zu lernenden Zeilenbeispiels ist die Anzahl der Überprüfungen der richtigen Antwortdaten ×(Elementare Nummer+1)。
Der Wert der Spalte ist 1, wenn für jede Überprüfung eine geeignete Veranlagung vorliegt, andernfalls 0.
Der Index der Spaltenidentität ist diktiert_features['(Identität)']Es wird von entschieden.
Die erste Spalte ist immer 1 für Lerngewichte, die nicht der Natur entsprechen.
	dict_Ignorieren Sie Features, die in Features nicht vorhanden sind.

Die Größe der Matrix der polaren Markierungen ist die Anzahl der Bewertungen x 1.
1 für positiven Inhalt und 0 für negativen Inhalt.

Rückgabewert:
Matrix zu lernen,Matrix der polaren Markierungen
	'''

	#Matrix mit 0 initialisieren
	data_x = np.zeros([len(sentiments), len(dict_features) + 1], dtype=np.float64)
	data_y = np.zeros(len(sentiments), dtype=np.float64)

	for i, line in enumerate(sentiments):

		#Identitätsextraktion
		data_x[i] = extract_features(line[3:], dict_features)

		#Satz polare Etikettenmatrizen
		if line[0:2] == '+1':
			data_y[i] = 1

	return data_x, data_y


def learn(data_x, data_y, alpha, count):
	'''Logistische Regression lernen

Rückgabewert:
Ausgebildetes Theta
	'''
	theta = np.zeros(data_x.shape[1])
	c = cost(data_x, theta, data_y)
	print('\t Beginnen Sie zu lernen\tcost:{}'.format(c))

	for i in range(1, count + 1):

		grad = gradient(data_x, theta, data_y)
		theta -= alpha * grad

		#Berechnen Sie die Kosten und den maximalen Anpassungsbetrag von Theta und zeigen Sie den Fortschritt an (einmal in 100 Mal).
		if i % 100 == 0:
			c = cost(data_x, theta, data_y)
			e = np.max(np.absolute(alpha * grad))
			print('\t lernen(#{})\tcost:{}\tE:{}'.format(i, c, e))

	c = cost(data_x, theta, data_y)
	e = np.max(np.absolute(alpha * grad))
	print('\t Lernen abgeschlossen(#{}) \tcost:{}\tE:{}'.format(i, c, e))
	return theta


def score(fname):
	'''Ergebnisberechnung aus der Ergebnisdatei
Liest die durch fname angegebene Ergebnisdatei und gibt die richtige Antwortrate, Präzisionsrate, Rückrufrate und F1-Punktzahl zurück.

Rückgabewert:
Richtige Antwortrate,Compliance-Rate,Erinnern,F1-Punktzahl
	'''
	#Lesen Sie die Ergebnisse und aggregieren Sie
	TP = 0		# True-Positive Erwartungen+1, richtige Antwort+1
	FP = 0		# False-Positive Erwartungen+1 ist die richtige Antwort-1
	FN = 0		# False-Negative Erwartungen-1 ist die richtige Antwort+1
	TN = 0		# True-Negative Erwartungen-1, richtige Antwort-1

	with open(fname) as data_file:
		for line in data_file:
			cols = line.split('\t')

			if len(cols) < 3:
				continue

			if cols[0] == '+1':			#Richtige Antwort
				if cols[1] == '+1':		#Erwartet
					TP += 1
				else:
					FN += 1
			else:
				if cols[1] == '+1':
					FP += 1
				else:
					TN += 1

	#Berechnung
	accuracy = (TP + TN) / (TP + FP + FN + TN)		#Richtige Antwortrate
	precision = TP / (TP + FP)		#Compliance-Rate
	recall = TP / (TP + FN)		#Erinnern
	f1 = (2 * recall * precision) / (recall + precision) 	#F1-Punktzahl

	return accuracy, precision, recall, f1


#Identitätswörterbuch lesen
dict_features = load_dict_features()

#Lesen Sie die richtigen Antwortdaten
with codecs.open(fname_sentiment, 'r', fencoding) as file_in:
	sentiments_all = list(file_in)

#Teilen Sie die richtigen Antwortdaten in 5
sentiments = []
unit = int(len(sentiments_all) / division)
for i in range(5):
	sentiments.append(sentiments_all[i * unit:(i + 1) * unit])

#5-Split-Kreuztest
with open(fname_result, 'w') as file_out:
	for i in range(division):

		print('{}/{}'.format(i + 1, division))

		#Teilen Sie die richtigen Antwortdaten zum Lernen und Verifizieren
		data_learn = []
		for j in range(division):
			if i == j:
				data_validation = sentiments[j]
			else:
				data_learn += sentiments[j]

		#Erstellen einer Reihe von Lernzielen und Polarbezeichnungen
		data_x, data_y = create_training_set(data_learn, dict_features)

		#Lernen
		theta = learn(data_x, data_y, alpha=learn_alpha, count=learn_count)

		#Überprüfung
		for line in data_validation:

			#Identitätsextraktion
			data_one_x = extract_features(line[3:], dict_features)

			#Vorhersage, Ergebnisausgabe
			h = hypothesis(data_one_x, theta)
			if h > 0.5:
				file_out.write('{}\t{}\t{}\n'.format(line[0:2], '+1', h))
			else:
				file_out.write('{}\t{}\t{}\n'.format(line[0:2], '-1', 1 - h))

#Ergebnisanzeige
print('\n Lernrate:{}\t Anzahl der Lernwiederholungen:{}'.format(learn_alpha, learn_count))
accuracy, precision, recall, f1 = score(fname_result)
print('Richtige Antwortrate\t{}\n Konformitätsrate\t{}\n Rückruf\t{}\nF1 Punktzahl\t{}'.format(
	accuracy, precision, recall, f1
))

Ausführungsergebnis:

Ausführungsergebnis


1/5
Lernkosten starten: 0.6931471805599453
Lernen(#100)	cost:0.46843942718055814	E:0.006388382573910524
Lernen(#200)	cost:0.4155300488897057	E:0.003950176267083882
Lernen(#300)	cost:0.3855283848183693	E:0.002867235531957132
Lernen(#400)	cost:0.3648933651792237	E:0.0022495471367582247
Lernen(#500)	cost:0.3493282931816998	E:0.0018583498524543404
Lernen(#600)	cost:0.3369232080431452	E:0.0016771358183603987
Lernen(#700)	cost:0.32666634898652896	E:0.001528412108716516
Lernen(#800)	cost:0.31795919554061053	E:0.0014042508127869423
Lernen(#900)	cost:0.31041943220497686	E:0.0012990594970099315
Lernen(#1000)	cost:0.30378857681325766	E:0.0012088047599478039
Lernen abgeschlossen(#1000) 	cost:0.30378857681325766	E:0.0012088047599478039
2/5
Lernkosten starten: 0.6931471805599453
Lernen(#100)	cost:0.4741687433335998	E:0.006589814822192543
Lernen(#200)	cost:0.42144780985764596	E:0.003908261118677938
Lernen(#300)	cost:0.3912183151335336	E:0.002804459291483359
Lernen(#400)	cost:0.370303379815077	E:0.0023610369221010326
Lernen(#500)	cost:0.354477846021314	E:0.0020514997491309413
Lernen(#600)	cost:0.3418460542105294	E:0.0018224684562050484
Lernen(#700)	cost:0.33139550986560584	E:0.001645643112098399
Lernen(#800)	cost:0.3225230456812948	E:0.0015047097369745835
Lernen(#900)	cost:0.31484124228803834	E:0.0013896119787524179
Lernen(#1000)	cost:0.3080871067835467	E:0.0012937962132790058
Lernen abgeschlossen(#1000) 	cost:0.3080871067835467	E:0.0012937962132790058
3/5
Lernkosten starten: 0.6931471805599453
Lernen(#100)	cost:0.46891949543978517	E:0.006357216339527686
Lernen(#200)	cost:0.41580499264287696	E:0.003532830533162978
Lernen(#300)	cost:0.3854553165948075	E:0.0027301913427912735
Lernen(#400)	cost:0.3644760512004263	E:0.0022545615099526647
Lernen(#500)	cost:0.3485986820681382	E:0.001919021249806922
Lernen(#600)	cost:0.3359163761795678	E:0.0016705021198879075
Lernen(#700)	cost:0.32541428766128333	E:0.0014797071516709523
Lernen(#800)	cost:0.31648958311645375	E:0.0013367387334497819
Lernen(#900)	cost:0.3087557956043563	E:0.0012494627215075146
Lernen(#1000)	cost:0.3019508027016161	E:0.0011779206121903469
Lernen abgeschlossen(#1000) 	cost:0.3019508027016161	E:0.0011779206121903469
4/5
Lernkosten starten: 0.6931471805599453
Lernen(#100)	cost:0.4725342546493931	E:0.006182597071964639
Lernen(#200)	cost:0.4194276723005623	E:0.0034649497530972943
Lernen(#300)	cost:0.38918298242842136	E:0.0025501444797361994
Lernen(#400)	cost:0.36832204557828535	E:0.0021388621069763788
Lernen(#500)	cost:0.3525543611131982	E:0.001855410065711756
Lernen(#600)	cost:0.33996964450743344	E:0.0016480855756071824
Lernen(#700)	cost:0.32955351095109425	E:0.0014898405345723522
Lernen(#800)	cost:0.32070420313966275	E:0.001365069555771408
Lernen(#900)	cost:0.3130363527272276	E:0.0012842751555114352
Lernen(#1000)	cost:0.3062888953703655	E:0.0012201511930926112
Lernen abgeschlossen(#1000) 	cost:0.3062888953703655	E:0.0012201511930926112
5/5
Lernkosten starten: 0.6931471805599453
Lernen(#100)	cost:0.47367883038307196	E:0.006165844710913304
Lernen(#200)	cost:0.42196370471708444	E:0.0038294500786362744
Lernen(#300)	cost:0.39242868456409186	E:0.002903639748114128
Lernen(#400)	cost:0.3720216436950633	E:0.002348459481805761
Lernen(#500)	cost:0.3565815749862366	E:0.0019763223680587666
Lernen(#600)	cost:0.34425094991837796	E:0.001708469854933442
Lernen(#700)	cost:0.33404185010109005	E:0.0015059837001246833
Lernen(#800)	cost:0.32536765342218166	E:0.001357007404701798
Lernen(#900)	cost:0.3178523514158344	E:0.0012612117027114012
Lernen(#1000)	cost:0.3112409530842421	E:0.0011798784899874886
Lernen abgeschlossen(#1000) 	cost:0.3112409530842421	E:0.0011798784899874886

Lernrate: 6.0 Anzahl der Lernwiederholungen: 1000
Richtige Antwortrate 0.7483114446529081
Konformitätsrate 0.749058734939759
Rückrufrate 0.7466691686995685
F1 Punktzahl 0.7478620430410676

Was ist ein Kreuztest?

Bei der Überprüfung der Genauigkeit der Trainingsergebnisse kann die Genauigkeit für unbekannte Daten nicht bestimmt werden, selbst wenn die für das Training verwendeten Daten zur Überprüfung verwendet werden. Darüber hinaus führt die Überprüfung mit den zum Lernen verwendeten Daten auch beim Lernen (als Überlernen bezeichnet) zu guten Ergebnissen, die beim sogenannten Auswendiglernen von Lehrbüchern nicht angewendet werden können. Daher ist es notwendig, mit den Daten zu überprüfen, die nicht für das Training verwendet werden. Dies wird als Kreuztest bezeichnet.

Es scheint einige gängige Methoden für Kreuztests zu geben. Der in dieser Frage angegebene "K-Teilungstest" ist eine Methode, um Daten in K zu unterteilen und eine davon zur Verifizierung und den Rest zum Lernen zu verwenden. Dies wird K-mal wiederholt, während die Verifizierungsdaten umgeschaltet und gemittelt werden. Details werden auf "gihyo.jp" von Technical Review Co., Ltd. veröffentlicht. 21. (endgültig) Beginnen wir mit dem maschinellen Lernen ) Ist leicht zu verstehen.

Im Beispiel Courseras Maschinelles Lernen wurde eine andere Methode empfohlen. Es ist eine Methode zum Teilen in drei Teile, Trainingsdaten, Anpassungsdaten und Verifizierungsdaten, Lernen mit Trainingsdaten, Anpassen mit Anpassungsdaten und schließlich Bestätigen der Genauigkeit des Ergebnisses mit Verifizierungsdaten. Weitere Informationen finden Sie in katsu1110s Coursera Machine Learning (6): Bewertung des maschinellen Lernmodells (Kreuztest, Bias & Varianz, Konformität & Rückruf). Die Zusammenfassung ist leicht zu verstehen.

Implementierung eines 5-teiligen Kreuzungstests

Ich habe die Daten einfach in 5 Teile geteilt und implementiert. Da es insgesamt 10.662 Daten gibt, entschied ich, dass die verbleibenden 2 Fälle, die nicht kaputt gingen, nicht mühsam zu behandeln waren ^^;

Beachten Sie, dass alle Funktionen aus den vorherigen Problemen erstellt wurden. In Bezug auf die Berechnung der Punktzahl ist das Ergebnis der 5-fachen Vorhersage [Problem], um die in Problem 77 erstellte "Punktzahl ()" zu verwenden. 76](http://qiita.com/segavvy/items/e107f764534f01c5b105) Ich habe einer Datei hinzugefügt und eine große Ergebnisdatei erstellt, die von score () verzehrt werden soll ..

Über die Verbesserung der Genauigkeit

Leider ist es auf knapp 75% gesunken. Es fühlt sich ein wenig leise an, aber ich werde vorerst mit dem nächsten Problem fortfahren.

Um die Genauigkeit zu verbessern, die Natur zu erhöhen, die Daten zu erhöhen, Normalisierungsparameter hinzuzufügen, das Polynom der hypothetischen Funktion zu erhöhen, die Methode zum Extrahieren der Natur zu überprüfen und so weiter. Es gibt ein Mittel. Selbst wenn Sie verschiedene Dinge selbst ausprobieren, verschwendet dies nur Zeit und es scheint, dass die Genauigkeit nicht einfach verbessert werden kann.

In Courseras Maschinelles Lernen ist die erste Ursache für Ungenauigkeiten bei der Verbesserung die Überanpassung (zu abhängig von Trainingsdaten, hohe Varianz). Es wurde gesagt, dass festgestellt werden sollte, ob es sich um eine Unteranpassung handelt (hohe Verzerrung, bei der die Trainingsdaten nicht vollständig genutzt werden). Dies kann durch Einführung eines normalisierten Parameters bestimmt werden. Das Ergebnis bestimmt den Ansatz zur Verbesserung. In Woche 6 von Maschinelles Lernen erfahren Sie mehr über die Überprüfung und Verbesserung.

Das ist alles für den 79. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.


Recommended Posts

100 Amateur-Sprachverarbeitungsklopfen: 41
100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 40
100 Amateur-Sprachverarbeitungsklopfen: 45
100 Amateur-Sprachverarbeitungsklopfen: 43
100 Amateur-Sprachverarbeitungsklopfen: 55
100 Amateur-Sprachverarbeitungsklopfen: 22
100 Amateur-Sprachverarbeitungsklopfen: 61
100 Amateur-Sprachverarbeitungsklopfen: 94
100 Amateur-Sprachverarbeitungsklopfen: 54
100 Amateur-Sprachverarbeitungsklopfen: 04
100 Amateur-Sprachverarbeitungsklopfen: 63
100 Amateur-Sprachverarbeitungsklopfen: 78
100 Amateur-Sprachverarbeitungsklopfen: 12
100 Amateur-Sprachverarbeitungsklopfen: 14
100 Amateur-Sprachverarbeitungsklopfen: 08
100 Amateur-Sprachverarbeitungsklopfen: 42
100 Amateur-Sprachverarbeitungsklopfen: 19
100 Amateur-Sprachverarbeitungsklopfen: 73
100 Amateur-Sprachverarbeitungsklopfen: 75
100 Amateur-Sprachverarbeitungsklopfen: 98
100 Amateur-Sprachverarbeitungsklopfen: 83
100 Amateur-Sprachverarbeitungsklopfen: 95
100 Amateur-Sprachverarbeitungsklopfen: 32
100 Amateur-Sprachverarbeitungsklopfen: 96
100 Amateur-Sprachverarbeitungsklopfen: 87
100 Amateur-Sprachverarbeitungsklopfen: 72
100 Amateur-Sprachverarbeitungsklopfen: 79
100 Amateur-Sprachverarbeitungsklopfen: 23
100 Amateur-Sprachverarbeitungsklopfen: 05
100 Amateur-Sprachverarbeitungsklopfen: 00
100 Amateur-Sprachverarbeitungsklopfen: 02
100 Amateur-Sprachverarbeitungsklopfen: 37
100 Amateur-Sprachverarbeitungsklopfen: 21
100 Amateur-Sprachverarbeitungsklopfen: 68
100 Amateur-Sprachverarbeitungsklopfen: 11
100 Amateur-Sprachverarbeitungsklopfen: 90
100 Amateur-Sprachverarbeitungsklopfen: 74
100 Amateur-Sprachverarbeitungsklopfen: 66
100 Amateur-Sprachverarbeitungsklopfen: 28
100 Amateur-Sprachverarbeitungsklopfen: 64
100 Amateur-Sprachverarbeitungsklopfen: 34
100 Amateur-Sprachverarbeitungsklopfen: 36
100 Amateur-Sprachverarbeitungsklopfen: 77
100 Amateur-Sprachverarbeitungsklopfen: 01
100 Amateur-Sprachverarbeitungsklopfen: 16
100 Amateur-Sprachverarbeitungsklopfen: 27
100 Amateur-Sprachverarbeitungsklopfen: 10
100 Amateur-Sprachverarbeitungsklopfen: 03
100 Amateur-Sprachverarbeitungsklopfen: 82